前言
每年的三四月份处于招聘旺季,技术问题是可以临时抱佛脚的,趁现在夯实自己的基础,常看面试高频问题,在面试时即可具有底气,下面我会出一份面试基础系列,希望大家都能够收割自己理想的offer!
构造函数与类的区别
1.构造函数prototype可以枚举,而类不行
2.构造函数可以不zhi用new关键字调用,而类只能使用new来调用
3.类不存在变量提升,而构造函数会
4.关键区别: 子类在实例化时先创建的是父级执行上下文,在子类的contructor修改this,进行多态,而构造函数则是创建实例的执行上下文并将构造函数的属性以及原型下的方法
箭头函数与普通函数的区别
1.箭头函数不具有arguments
2.箭头函数没有contructor,因而无法使用new关键字调用
3.箭头函数的this指向是在声明的时候创建的,它指向的是父级所在的执行上下文,而普通函数this指向是在执行时决定的
4.箭头函数不能使用yield
为什么‘string’可以调用String对象下的API
我们知道属性与方法只有object才会有,但是字面量string却可以使用repeat等API,原因是javascript存在着装箱拆箱的情况,'string'在调用API时,javascript内部会生成一个隐式String对象(装箱),然后调用对应的API返回结果,最后删除该String对象(拆箱)
为什么推荐用void0来代替undefined
原因是undefined可以作为变量使用,在IE8及以下的浏览器里undefined可以被赋值,void会计算后面的表达式,0是耗时最小的,通常使用void0来代替undefined
Primose有哪些API
1.all
将数组里的所有表达式包裹在Promise.resolve下,当所有Promise状态都更改为resolved时会收集所有数据通过then返回
缺点:只有有一个状态是reject就不会走resolve函数
2.race
数组里所有表达式同时执行,只要其中一个返回了就会调用then方法,但是剩余的元素表达不会中断
缺点: race无法分辨是resolve还是reject,只要是其中Promise状态变更就会返回
3.allSettled
弥补了all方法的缺陷,它会将所有表达式结果的状态和返回的数据都会返回给then第一个函数里
4.any
改良版race,只有当第一个Promise是resolved才会返回,若是所有的都是rejected的话,会走reject函数或者catch函数返回All promises were rejected提示
作用域链
javascript在执行代码时会做一些准备工作,而这些准备工作就是创建执行上下文,执行上下文由以下三部分组成:
1.变量对象
2.this指向
3.作用域链
执行上下文的管理方式:
执行上下文则是由执行上下文栈进行管理
我们在第一次运行javascript代码时,会生成一个全局的执行上下文globalContext,然后压入到执行上下文栈
了解了执行上下文后,我们来继续了解下作用域链是怎么形成的
我们知道javascript是词法作用域,函数的作用域是在函数声明的时候就创建的,接下来剖析一下具体过程:
var a = 1
function foo() {
console.log(a)
}
foo()
首先foo函数定义时会赋值当前的执行上下文的作用域链到函数的[[Scope]]下保存
随后调用foo函数,此时函数不会立即执行,而是首先会去创建执行上下文:
1.赋值函数的[[Scope]]初始化当前作用域链
2.基于arguments创建一个活动对象(AO),里面包含了局部变量、参数等等
3.将活动对象压入第一步创建的作用域链
{
AO, 活动对象
VO, 父级的变量对象
}
这里就连成了一条当前执行上下文的作用域链
4.随后根据当前调用对象来初始化this指向
5.函数执行上下文压入执行上下文栈
6.函数执行完后,消除AO对象,并弹出执行上下文
setInterval弊端
setInterval函数是window下内置的函数,常用于计时器,但其存在一个弊端,setInterval的回调函数并不是在计时器到达时间后立即执行,而是被推入到任务队列里,如果回调函数执行时间过长,则会导致计时器并不是按照实际的时间间隔执行的,这里可以使用setTimeout进行模拟修正
function setIntervalSimute(callback) {
setTimeout(() => {
callback()
setIntervalSimute(callback)
}, waitTime)
}