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注册事件就可以。