盒子
盒子

call、apply调用

一般用Object.prototype.toString.call();判断对象类型
如:

1
2
3
Object.prototype.toString.call(Array); //  [object Function]
Object.prototype.toString.call(Array.prototype); // [object Array]
Object.prototype.toString.call(Array.prototype.__proto__); // [object Object]

我们可以用:
({})替代Object.prototype,因为
({}).toString === Object.prototype.toString,对象的toString方法是从Object.prototype上面继承的
故有:

1
({}).toString.call(Array) // [object Function]

少写了很多,类似的,数组的原型方法,Array.prototype,如forEach,map,slice…等等
修改之前:

1
2
3
Array.prototype.forEach.call('123', item => {
console.log(item);
});

以上分别打印出1, 2, 3
由于 :[].forEach === Array.prototype.forEach
故有:

1
2
3
[].forEach('123', item => {
console.log(item);
});

效果一样
这种一般用在类数组的变量上,如函数的内置变量arguments,不是一个数组,但是是一个类数组变量,有length,如果直接遍历,只能用for循环之类的,我们可以借助,Array.prototype.forEach方法,调用时候会将arguments自动转成数组,在调用forEach方法,其实可以理解成为

1
2
3
Array.From(arguments).forEarch(item => {
console.log(item);
});

支持一下
扫一扫,支持 Alin
  • 微信扫一扫
  • 支付宝扫一扫