前端面试答案1
1.第三个参数决定捕获还是冒泡。true是捕获
2阻止冒泡:.w3c的方法是e.stopPropagation(),IE则是使用e.cancelBubble = true
3.
监听dom
EventUtil.addHandler(document,"DOMSubtreeModified",function(event){
console.log(event.type); //1:DOMNodeRemoved
console.log(event.target); //2:ul节点,即被删除的节点
console.log(event.relatedNode); //3:body节点,即被删除节点的父节点
})
4.event loop都不陌生,是指主线程从“任务队列”中循环读取任务:script(主程序代码)—>process.nextTick—>Promises...——>setTimeout——>setInterval——>setImmediate——> I/O——>UI rendering
5.
浏览器中的事件循环 eventLoop,分为同步执行栈和异步队列,首先会执行同步的任务,当同步任务执行完之后会从异步队列中取异步任务拿到同步执行栈中进行执行。
在取异步队列时,还会有一个区分,就是区分微任务和宏任务。
- microtask:微任务,优先级高,并且可以插队,不是先定义先执行。包括:promise 中的 then,observer,MutationObserver,setImmediate
- macrotask:宏任务,优先级低,先定义的先执行。包括:ajax,setTimeout,setInterval,事件绑定,postMessage,MessageChannel(用于消息通讯)
6.
原型
JavaScript 规定,每个函数都有一个prototype属性,指向一个对象。
对于普通函数来说,该属性基本无用。但是,对于构造函数来说,生成实例的时候,该属性会自动成为实例对象的原型。
原型对象的属性不是实例对象自身的属性。只要修改原型对象,变动就立刻会体现在所有实例对象上。
总结一下,原型对象的作用,就是定义所有实例对象共享的属性和方法。这也是它被称为原型对象的原因,而实例对象可以视作从原型对象衍生出来的子对象。
原型链
JavaScript 规定,所有对象都有自己的原型对象(prototype)。一方面,任何一个对象,都可以充当其他对象的原型;另一方面,由于原型对象也是对象,所以它也有自己的原型。因此,就会形成一个“原型链”(prototype chain):对象到原型,再到原型的原型……
如果一层层地上溯,所有对象的原型最终都可以上溯到Object.prototype,即Object构造函数的prototype属性。也就是说,所有对象都继承了Object.prototype的属性。这就是所有对象都有valueOf和toString方法的原因,因为这是从Object.prototype继承的。
那么,Object.prototype对象有没有它的原型呢?回答是Object.prototype的原型是null。null没有任何属性和方法,也没有自己的原型。因此,原型链的尽头就是null。
读取对象的某个属性时,JavaScript 引擎先寻找对象本身的属性,如果找不到,就到它的原型去找,如果还是找不到,就到原型的原型去找。如果直到最顶层的Object.prototype还是找不到,则返回undefined。如果对象自身和它的原型,都定义了一个同名属性,那么优先读取对象自身的属性,这叫做“覆盖”(overriding)。
注意,一级级向上,在整个原型链上寻找某个属性,对性能是有影响的。所寻找的属性在越上层的原型对象,对性能的影响越大。如果寻找某个不存在的属性,将会遍历整个原型链
es6常用属性方法:https://www.cnblogs.com/fangsmile/p/7081194.html
箭头函数:
注意箭头函数的语法是去掉之前的function,没有参数或者多个参数时需要加括号(),多个参数时使用逗号分隔,一个参数时括号可以省略。
(2)隐士返回,如 下面的代码可以去掉return,代码移到一行,减少代码量。
(3)解决了this的指向问题,原生的写法this指向的是调用者,箭头函数this绑定的是定义时的那个对象。
箭头函数的this绑定看的是this所在的函数定义在哪个对象下,绑定到哪个对象则this就指向哪个对象
如果有对象嵌套的情况,则this绑定到最近的一层对象上
深拷贝几种方式:对于数组类型,可以使用slice(start, end)方法,返回一个新的数组
对于对象类型,可以使用Object.assign({},obj),拷贝到一个新的对象上
使用ES6语法的扩展运算符,就是
通过JSON.stringify()和JSON.parse()方法