前端面试-总结4

31 阅读2分钟

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
}

www.cnblogs.com/jacky02/p/1…

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