面试题积累

1、什么是Promise(23-12-13)(es6)

Promise异步编程的一种解决方案。Promise是一个构造函数,接收一个函数作为参数,返回一个 Promise 实例。一个 Promise 实例有三种状态,分别是pendingfulfilledrejected,分别代表了进行中、已成功和已失败。实例的状态只能由 pending 转变 fulfilled 或者 rejected 状态,并且状态一经改变,就无法再改变了。状态的改变是通过resolve()reject()函数来实现的,可以在异步操作结束后调用这两个函数改变 Promise 实例的状态。Promise 的原型上定义了一个 then方法,使用这个 then 方法可以为两个状态的改变注册回调函数。这个回调函数属于微任务,会在本轮事件循环的末尾执行。

2、this 的理解?(23-12-14)(es6)

  1. 概念:
    this是 JS 的一个关键字,它是函数运行时,自动生成的一个内部对象,只能在函数内部使用,随着函数使用场合的不同,this的值会发生变化,但有一个总的原则:this指的是调用函数的那个对象
  2. 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相映射、支持块级作用域、在声明的上面访问变量会报错

  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值