web前端面试题(三):JS篇
程序员文章站
2022-06-09 11:19:02
...
1、原始类型
b u n n s s(Boolean,Undefined,Number,Null,String,Symbol)
2、null是对象吗
首先当使用typeof检测的时候会输出Object,但这是js的bug,null表示空指针,
typeof null也是object,null instanceof Object —> false
3、对象类型和原始类型的不同之处
原始类型储存的是值,对象类型储存的是指针
4、类型转换
转Boolean:在条件判断时,除了 undefined, null, false, NaN, '', 0, -0,
其他所有值都转为 true,包括所有对象。
对象转原始类型:对象在转换类型的时候,会调用内置的 [[ToPrimitive]] 函数
5、说一下事件代理?
事件委托是指将事件绑定到目标元素的父元素上,利用冒泡机制触发该事件
6、target、currentTarget的区别?
currentTarget当前所绑定事件的元素;target当前被点击的元素。
7、说一下宏任务和微任务?
宏任务:当前调用栈中执行的任务称为宏任务。(主代码快,定时器等等)。
微任务: 当前(此次事件循环中)宏任务执行完,在下一个宏任务开始之前需要执行的任务为
微任务。(可以理解为回调事件,promise.then,proness.nextTick等等)。
宏任务中的事件放在callback queue中,由事件触发线程维护;微任务的事件放在微任务队列中,
由js引擎线程维护。
8、说一下继承的几种方式及优缺点?
借用构造函数继承,使用call或apply方法,将父对象的构造函数绑定在子对象上
原型继承,将子对象的prototype指向父对象的一个实例
组合继承
原型链继承的缺点
字面量重写原型会中断关系,使用引用类型的原型,并且子类型还无法给超类型传递参数。
借用构造函数(类式继承)
借用构造函数虽然解决了刚才两种问题,但没有原型,则复用无从谈起。
组合式继承
组合式继承是比较常用的一种继承方法,其背后的思路是使用原型链实现对原型属性和方法的继承,
而通过借用构造函数来实现对实例属性的继承。这样,既通过在原型上定义方法实现了函数复用,
又保证每个实例都有它自己的属性。
9、说一下闭包?
闭包的实质是因为函数嵌套而形成的作用域链
定义即:函数 A 内部有一个函数 B,函数 B 可以访问到函数 A 中的变量,那么函数 B 就是闭包
10、export和export default的区别?
使用上的不同
export default xxx
import xxx from './'
export xxx
import {xxx} from './'
11、什么是会话cookie,什么是持久cookie?
cookie是服务器返回的,指定了expire time(有效期)的是持久cookie,没有指定的是会话cookie
12、数组去重
es6:
Array.from(new Set(array)) //Array.from()能把set结构转换为数组
Set去重:[...new Set(array)]
indexOf去重:let newArr = [];for (...) {if(newArr.indexOf(arr[i])==-1){newArr.push(arr[i]);}}
splice去重:for(...i){ for(...j){if(arr[i]==arr[j]){arr.splice(j,1);j--;}} }
sort去重:arr = arr.sort();let array = [arr[0]];for(){if(arr[i]!=arr[i-1]){array.push(arr[i])}}
includes去重:if(!newArr.includes(arr[i])){newArr.push(arr[i]);}
13、get、post的区别
get传参方式是通过地址栏URL传递,是可以直接看到get传递的参数,post传参方式参数URL
不可见,get把请求的数据在URL后通过?连接,通过&进行参数分割。psot将参数存放在HTTP
的包体内
get传递数据是通过URL进行传递,对传递的数据长度是受到URL大小的限制,URL最大长度是
2048个字符。post没有长度限制
get后退不会有影响,post后退会重新进行提交
get请求可以被缓存,post不可以被缓存
get请求只支持URL编码,post支持多种编码方式
get请求的记录会留在历史记录中,post请求不会留在历史记录
get只支持ASCII字符,post没有字符类型限制
14、主要是用es6哪些新特性
不一样的变量声明:const和let;
模板字符串:${}和反引号;
箭头函数(Arrow Functions):精简代码;
函数的参数默认值:给定默认值,省去在函数体内赋值;
Spread / Rest 操作符:函数传入多个参数时,函数可用...+形参名称接收;
对象和数组解构:const {a,b} = obj;
for...of 和 for...in
ES6中的类:继承关键字super()
15、防抖和节流的概念、用途、优缺点、实现方式、区别
函数防抖(debounce):触发高频事件后n秒内函数只会执行一次,
如果n秒内高频事件再次被触发,则重新计算时间。
函数节流(throttle):高频事件触发,但在n秒内只会执行一次,所以节流会稀释函数的执行频率。
函数节流(throttle)与 函数防抖(debounce)都是为了限制函数的执行频次,
以优化函数触发频率过高导致的响应速度跟不上触发频率,出现延迟,假死或卡顿的现象。
防抖实现方式:每次触发事件时设置一个延迟调用方法,并且取消之前的延时调用方法
防抖的缺点:如果事件在规定的时间间隔内被不断的触发,则调用方法会被不断的延迟
节流实现方式:每次触发事件时,如果当前有等待执行的延时函数,则直接return
两者区别:函数节流一定会在指定时间内触发一次事件处理函数,而防抖函数则是在最后一次触发事件后执行函数
使用场景:防抖函数在页面下拉刷新时可以使用,节流函数在页面比如在滚动中一定时间内触发Ajax
16、this关键字
“this” 一般是表示当前所在的对象,但是事情并没有像它应该的那样发生。JS中的this关键字由
函数的调用者决定,谁调用就this就指向哪个。如果找不到调用者,this将指向windows对象
17、变量的提升
变量的提升是JavaScript的默认行为,这意味着将所有变量声明移动到当前作用域的顶部,
并且可以在声明之前使用变量。初始化不会被提升,提升仅作用于变量的声明。
18、js的异步情况以及异步解决
js的异步情况:
1)异步函数,比如 setTimeout和setInterval
2)ajax
3)node.js中的许多函数也是异步的
异步问题的解决
1)命名函数:清除嵌套回调的一个便捷的解决方案是简单的避免双层以上的嵌套,
传递一个命名函数给作为回调参数,而不是传递匿名函数
使用promise
promise在异步执行的流程中,把执行代码和处理结果的代码清晰地分离了
promise还可以做若干个异步的任务
19、解释一下严格模式(strict mode)
严格模式用于标准化正常的JavaScript语义。严格模式可以嵌入到非严格模式中,关键字
‘use strict’。使用严格模式后的代码应遵循JS严格的语法规则。
例如,分号在每个语句声明之后使用。
20、apply 和 call 什么含义,什么区别 ?什么时候用 ?
call,apply 都属于 Function.prototype 的一个方法,它是 JavaScript 引擎内在实现的,因为
属于 Function.prototype,所以每个 Function 对象实例(就是每个方法)都有 call,apply 属性。
既然作为方法的属性,那它们的使用就当然是针对方法的了,这两个方法是容易混淆的,因为
它们的作用一样,只是使用方式不同。
相同点:两个方法产生的作用是完全一样的。
不同点:方法传递的参数不同。
每个函数对象会有一些方法可以去修改函数执行时里面的 this,比较常见得到就是 call 和 apply,
通过 call 和 apply 可以重新定义函数的执行环境,即 this 的指向。
21、简述Promise
Promise 是异步编程的一种解决方案,比传统的异步解决方案【回调函数】和【事件】
更合理、更强大。现已被 ES6 纳入进规范中。
Promise类的构造函数接受一个参数,该参数是一个函数(执行器函数,可以参照mdn中
promise说明),执行器函数在实例化后立即执行(resolve或reject)
Promise有三种状态,分别是pending/fulfilled/rejected,一旦状态确定就不可更改
状态改变只能是pending=>fulfilled 或者 pending=>rejected;
resolve和reject函数是用来更改状态的 resolve: fulfilled reject: rejected
then方法内部做的事情就判断状态 如果状态是成功 调用成功的回调函数 如果状态是失败
调用失败回调函数 then方法是被定义在原型对象中的
then成功回调有一个参数 表示成功之后的值 then失败回调有一个参数 表示失败后的原因
22、async/await的用法和理解
async 是一个修饰符,async 定义的函数会默认的返回一个Promise对象resolve的值,
因此对async函数可以直接进行then操作,返回的值即为then方法的传入函数
await 也是一个修饰符,await 关键字 只能放在 async 函数内部, await关键字的作用 就是获取
Promise中返回的内容, 获取的是Promise函数中resolve或者reject的值
如果await 后面并不是一个Promise的返回值,则会按照同步程序返回值处理
上一篇: 2019前端面试题(js篇)
下一篇: 前端面试题总结-JS篇(1)