Js零散知识点笔记

原型继承

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。

原文地址:https://www.cnblogs.com/NKnife/p/6226019.html