原型继承
function Obj() { this.val = 321 } Obj.prototype.protoVal = 123 let obj = new Obj() console.log(obj.val === 321) // obj 的属性 console.log(obj.protoVal === 123) // 从 Obj 构造器的 prototype 继承的属性 console.log(obj.__proto__ === Obj.prototype) // __proto__ 属性等于 Obj 构造器的 prototype
function Con1() {} Con1.prototype.a = 123 function Con2() {} Con2.prototype = new Con1() // 构造器 Con2 继承 Con1 的原型 var obj = new Con2() obj.a // 123
将类数组对象转换为数组
ES5:
var arrLike = document.querySelectorAll('span'); var arr = Array.prototype.slice.call(arrLike);
ES6:
var arrLike = document.querySelectorAll('span'); var arr = [...arrLike];
任务执行顺序
macro-task(宏任务) 取出一个任务,执行完后再执行下一个 macro-task 。每个 macro-task里面先执行普通代码,执行完后再执行 micro-task(微任务),micro-task 执行完后才执行下一个macro-task。setTimeout 等 macro-task 会将代码推入下一个 macro-task ,直到上次 macro-task 执行完毕才会执行代码。
macro-task: script(整体代码), setTimeout, setInterval, setImmediate, I/O, UI rendering
micro-task: process.nextTick, 原生Promise, Object.observe, MutationObserver
Function.toString
function fn() { 'abc' } fn.toString = function (arg) { return 123; } alert(fn); console.log(fn == 123); console.log(fn === 123);
第一个 alert 打印的是 123, alert 方法会调用 toString 方法,所以打印的是 123 。
第二个 console.log 则是隐式转换,触发了 fn.toString, 所以打印的是 true。
第三个 console.log 没有隐式转换,所以打印的是 false。