new做了什么?
创建一个对象,(var obj = {}) ;
将构造函数的this指向该对,_ proto_ == Foo的原型Foo.prototype;
执行构造函数的方法,使该对象继承构造函数的方法和属性;
返回值的构造函数做判断处理,返回该对象。
function Fun(age, name) {
this.age = age
this.name = name
return 1
}
function myNew(fn, ...args) {
//1、先创造空对象
//其实等于var obj = Object.create({})
var obj = {}
//2、obj的__proto__指向原型
Object.setPrototypeOf(obj, fn.prototype)
//3、改变this指向,执行构造函数内部函数
var result = fn.apply(obj, args)
//4、判断return
return result instanceof Object ? result : obj
}
for循环中的作用域问题
for(var i=1; i<3;i++){ setTimeout(() => { console.log(i) }, 0); }
打印为 3
var作用域问题,所以for循环完毕才会执行setTimeout
异步和单线程
1.js任务分为同步任务和异步任务
2.同步任务在主线程上执行形成执行栈,
3.事件触发线程管理一个任务队列
4.异步任务触发条件达成将回调事件放在任务队列中
5.执行栈中的同步任务执行完毕,之后读取任务队列,将可运行的异步任务回调事件添加到执行栈中
setTimeout(() => { console.log(1) }, 100);
setTimeout(() => { console.log(2) }, 100);
new Promise((res,rej)=>{ console.log(3) res(4) }).then(function(val){ console.log(val) })
new Promise((res,rej)=>{ console.log(5) res(6) }).then(function(val){ console.log(val) })
console.log(7)
// 打印结果 3 5 7 4 6 1 2
宏任务:script,setTimeout,setInterval,setImmediate,render
微任务:process.nextTick,Promise
执行 顺序:先执行同步代码,遇到异步宏 任务则将异步宏 任务放入宏 任务队列中,遇到异步微 任务则将异步微 任务放入微 任务队列中,当所有同步代码执行完毕后,再将异步微 任务从队列中调入主线程执行,微 任务 执行完毕后再将异步宏 任务从队列中调入主线程执行,一直循环直至所有任务 执行完毕。
typeof和instanceof区别
typeof主要用于非引用数据类型也就是基本数据类型,比如:number,string,undefined,symbol,boolean
注意:typeof null返回是object
instanceof主要用于引用数据类型,非应用数据类型返回false
## let的暂时性死区
var a = 123;
if (true) {
// 变量a的暂时性死区开始
console.log(a); // ReferenceError: Cannot access 'a' before initialization
let a;
// 变量a的暂时性死区开始
console.log(a); // undefined
a = 123;
console.log(a); // 123 }
var变量名提升
console.log(a); // undefined
var a = 10;
console.log(a); // 10