1.如何让object使用for-of?
分析:for-of是用来遍历内置了迭代器的对象。所以这个问题目的是让在Object上实现迭代器。
以下代码默认你是对[Symbol.iterator]有所了解的。
Object.prototype[Symbol.iterator] = function () {
let keys = Object.keys(this);
let index = 0;
return {
next: () => {
return {
value: this[keys[index++]],
done: index >= keys.length + 1,
}
}
}
}
2.如何将object转换为Map对象?
var obj = { a: 1, b: 2, c: 3 }; //将obj转换为包含键值对的数组,再用Map构造函数进行转换。
var obj = { a: 1, b: 2, c: 3 };
//将obj转换为包含键值对的数组,再用Map构造函数进行转换。
var map = new Map(Object.entries(obj));
console.log(map);
3.new操作符做了什么事情?
const myNew = (fn,...args) => {
//1.创建一个空对象。
let obj = {};
//2.将obj的__proto__属性,指向构造函数的Prototype
obj.__proto__ = fn.prototype;
//3.将构造函数的this赋值给obj,执行构造函数内部并且拿到构造函数返回值
let res = fn.apply(obj,args)
//4.判断构造函数的返回值,如果时复杂类型则返回这个返回值,否则返回这个空对象。
return res instanceof Object ? fn() : obj;
}
4.说一说对作用域链的理解
作用域链的作用是保证执行环境里访问变量和函数的有序性。作用域链只能向上访问,访问到window对象后终止。
比如我们创建了一个函数,在函数内部能访问的变量为第一个活动对象。这个活动对象包含了函数参数,以及arguments。
然后继续访问这个函数外部的作用域,这时也就是全局作用域,也就是这个函数第二个活动对象,包括this。
这个作用域链一直向外 串起了所有包含函数的活动对象,直到全局执行上下文才终止。
function compare(value1, value2) {
if (value1 < value2) {
return -1;
} else if (value1 > value2) {
return 1;
} else {
return 0;
}
}
let result = compare(5, 10);
看上面这个例子。
在调用这个函数cpmpare()时,会创建一个活动对象包含:arguments,vlue1,value2。这个对象是作用域链上的第一个对象。
而全局上下文的变量是 conpare函数作用域链上的第二个对象。 包含:this,result和 compare。
5.箭头函数和普通函数的区别
箭头函数是ES6提出的,
与普通函数的区别主要是:
1.写法上,箭头函数更简洁,比如:只有一个参数可以不写括号;如果函数的返回值只有一句,可以不写大括号和return;
2.箭头函数没有自己的this。只会继承沿着作用域链外部的this。
因为没有自身的this,所以
箭头函数不能作为构造函数;不能使用call,bind,apply函数修改this指向;不能作为generator函数。
箭头函数也没有arguments属性,也没有prototype属性。