2022面试题JS(一)

1、JS的事件循环

  • 当JS代码从上往下执行遇到异步任务的时候,主线程会挂起这个任务,继续往下执行代码,然后在异步任务返回结果的时候再根据一定规则去执行
  • 异步任务分类:宏任务(setTimeout),微任务(promise)
  • 所有同步任务都在主线程上执行,形成一个执行栈
  • 遇到异步任务放到任务表中,等事件执行完成之后放到任务队列
  • 当执行栈的同步任务执行完成之后,就会执行任务队列的第一个异步任务,其中把宏观任务和微观任务都执行完成后才进行下一次循环

2、深拷贝和浅拷贝

  • 浅拷贝
    • 两个引用类型指向同一个地址,改变一个,另一个也会随之改变
  • 深拷贝
    • 复制后引用类型指向一个新的内存地址,两个对象改变互不影响

数组的方法concat、slice是深拷贝还是浅拷贝

  • 对一维数组来说是深拷贝,对多维数组来说是浅拷贝

3、JS中new的作用

  • 创建了一个新的空对象
  • 将构造函数的作用域赋值给新对象(this指向新对象)
  • 执行构造函数(为这个新对象添加属性)
  • 返回新对象

4、JS中的原型链

  • JS是面向对象的,每个实例对象都有一个_proto_属性,该属性指向它的原型对象,这个实例对象的构造函数有一个原型属性prototype,与实例的_proto_属性指向同一个对象。当对象在查找一个属性时,自身没有就会根据_proto_向它的原型进行查找,如果都没有,则向它的原型的原型继续查找,直到查找到Object.prototype._proto为null,这样就形成了原型链。
  • 原型主要是解决继承问题

5、什么是闭包

  • 闭包就是能够访问其他函数内部变量的函数
  • 闭包的作用就是保存自己私有的变量,通过提供的接口给外部使用,但外部不能直接访问该变量
  • 优点:隐藏变量以及防止变量被篡改和作用域污染,从而实现封装
  • 缺点:函数执行完后,函数内的局部变量没有释放,占用内存时间变长,容易造成内存泄漏
  • 解决办法:让内部函数变成垃圾对象,赋值为null,及时释放,让浏览器回收闭包

6、JS中this的指向

  • 全局函数指向window
  • 构造函数指向实例对象
  • 对象的方法指向对象
  • 事件处理函数指向事件的对象
  • 定时器函数指向window
  • 箭头函数中不绑定this,定义箭头函数的作用域的this指向谁它就指向谁
  • apply调用this指向apply方法的第一个参数
  • 立即执行函数指向window

7、箭头函数和普通函数之间的区别

  • 箭头函数不能使用new关键字
  • 箭头函数不绑定arguments
  • 箭头函数没有prototype
  • 使用call、applay、bind调用,传入参数时,参数的改变对this没有影响

8、实现继承的方法有哪些

  • 原型链继承
  • 构造函数继承
  • 组合继承
  • 寄生组合继承
  • es6中的calss类继承

9、什么是事件捕获

  • 先触发父元素的事件,再触发子元素的事件

10、什么是事件冒泡

  • 先触发子元素的事件,再触发父元素的事件

11、如何阻止事件冒泡和默认行为

  • event.stopPropagation()阻止事件冒泡,但不会阻止默认行为(执行超链接的跳转)
  • return.false阻止事件冒泡也阻止默认行为
  • event.preventDefault()阻止默认行为,不阻止事件冒泡

12、什么是事件委托

  • 事件委托就是某件事情本来该自己干的,但是自己不干,交给别人来干。他可以提高性能,比如当有很多li需要注册事件的时候,如果使用传统的方法就需要给每个li都注册事件,但是使用事件委托的话,就只需要给ul注册事件就可以。
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值