1、什么是Promise(23-12-13)(es6)
Promise
异步编程的一种解决方案。Promise
是一个构造函数,接收一个函数作为参数,返回一个 Promise 实例。一个 Promise 实例有三种状态,分别是pending
、fulfilled
和rejected
,分别代表了进行中、已成功和已失败。实例的状态只能由 pending 转变 fulfilled 或者 rejected 状态,并且状态一经改变,就无法再改变了。状态的改变是通过resolve()
和reject()
函数来实现的,可以在异步操作结束后调用这两个函数改变 Promise 实例的状态。Promise 的原型上定义了一个 then
方法,使用这个 then 方法可以为两个状态的改变注册回调函数。这个回调函数属于微任务,会在本轮事件循环的末尾执行。
2、this 的理解?(23-12-14)(es6)
- 概念:
this
是 JS 的一个关键字,它是函数运行时,自动生成的一个内部对象,只能在函数内部使用,随着函数使用场合的不同,this
的值会发生变化,但有一个总的原则:this
指的是调用函数的那个对象
。 - this的指向:
① 作为普通函数执行时,this
指向window
,但在严格模式下this
指向undefined
。
② 函数作为对象里的方法被调用时,this
指向该对象.
③ 当用new
运算符调用构造函数时,this
指向返回的这个对象。
④ 箭头函数的this
绑定看的是this
所在函数定义在哪个对象下,就绑定哪个对象。如果存在嵌套,则this
绑定到最近的一层对象上。
⑤call()
、apply()
、bind()
是函数的三个方法,都可以显示的指定调用函数的this
指向。
3、 防抖和节流的区别,以及手写实现?(23-12-19)(es6)
防抖
:多次触发事件,事件处理函数只执行一次,并且是在触发操作结束时执行。也就是说,当一个事件被触发,准备执行事件函数前,会等待一定的时间,在这个等待时间内,如果没有再次被触发,那么就执行,如果又触发了,那就本次作废,重置等待时间,直到最终能执行。
主要应用场景:搜索框搜索输入,用户最后一次输入完,再发送请求;手机号、邮箱验证输入检测
节流
:事件触发后,规定时间内,事件处理函数不能再次被调用。也就是说在规定的时间内,函数只能被调用一次,且是最先被触发调用的那次。
主要应用场景:高频点击、表单重复提交等。
4、原型和原型链?(23-12-18)(es6)
JS 是面向对象的,每个实例对象都有一个__proto__
属性,该属性指向它的原型
对象。该实例的构造函数有一个原型属性prototype
,与实例的__proto__
属性指向同一个对象。同时,原型
对象的constructor
指向构造函数本身。
当一个对象在查找一个属性时,自身没有就会根据__proto__
属性向它的原型
进行查找,如果还是没有,则向它的原型
的原型
继续查找,直至查到Object.prototype.__proto__
也就是null
,这样就形成了原型链
。
5、JS 中的作用域和作用域链?(23-12-16)(es6)
作用域
,即变量(变量作用域又称上下文)和函数生效(能被访问)的区域或集合。作用域决定了代码区块中变量和其他资源的可见性。一般可分为:全局作用域
、局部作用域(函数作用域)
、块级作用域
。
全局作用域
:任何不在函数中或是大括号中声明的变量,都是在全局作用域下,全局作用域下声明的变量可以在程序的任意位置访问。局部作用域
:也叫做函数作用域
,如果一个变量是在函数内部声明的,它就在一个函数作用域下面。这些变量只能在函数内部访问,不能在函数以外去访问。块级作用域
:凡是代码块就可以划分变量的作用域,这种作用域的规则就叫做块级作用域。
作用域链
:当在 JS 中使用一个变量时,JS 引擎会尝试在当前作用域下寻找该变量,如果没找到,再到它的上层作用域寻找,以此类推,直至找到该变量或是查找至全局作用域,如果在全局作用域里仍然找不到该变量,它就会在全局范围内隐式声明该变量(非严格模式下)或是直接报错。
js 采用的是静态作用域,所以函数的作用域在函数定义时就确定了
6、EventLoop 事件循环?(23-12-15)(es6)
js 是单线程运行的,当遇到一个异步事件后并不会一直等待其返回结果,而是会将这个事件挂起,继续执行执行栈中的其他任务。当一个异步事件返回结果后,js会将这个事件加入与当前执行栈不同的另一个队列--事件队列(
Task Queue
)
。被放入事件队列不会立刻执行其回调,而是等待当前执行栈中的所有任务都执行完毕, 主线程处于闲置状态时,主线程会去查找事件队列是否有任务。如果有,那么主线程会从中取出排在第一位的事件,并把这个事件对应的回调放入执行栈中,然后执行其中的同步代码...,如此反复,这样就形成了一个无限的循环,这个过程被称为事件循环(
Event Loop
)
。
实际上,异步任务之间并不相同,它们的执行优先级也有区别。异步任务分两类:微任务(
micro task
)和宏任务(
macro task
)
。.
7、闭包?(23-12-20)(es6)
在 JavaScript 中,每当创建一个函数,闭包就会在函数创建的同时被创建出来。可以在一个内层函数中访问到其外层函数的作用域。
闭包就是能够读取其他函数内部变量的函数。主要作用是解决变量污染问题,也可以用来延长局部变量的生命周期。
优点:延长局部变量的生命周期
缺点:会导致函数的变量一直保存在内存中,过多的闭包可能会导致内存泄漏
8、es5继承和es6继承有什么区别(23-12-21)(es6)
1. ES5继承是通过在原型上定义函数和属性来实现继承,ES6继承是通过extends关键字实现继承,并可以实现多继承。
2. ES5继承会继承父类的实例属性和方法,ES6继承只能继承父类的原型属性和方法。
3. ES5继承不能实现多继承,ES6继承可以实现多继承。
9、var、let、const之间的区别(23-12-22)(es6)
var声明变量可以重复声明,而let不可以重复声明
var是不受限于块级的,而let是受限于块级
var会与window相映射(会挂一个属性),而let不与window相映射
var可以在声明的上面访问变量,而let有暂存死区,在声明的上面访问变量会报错
const声明之后必须赋值,否则会报错
const定义不可变的量,改变了就会报错
const和let一样不会与window相映射、支持块级作用域、在声明的上面访问变量会报错