MDN上的apply介绍: apply- MDN

apply()方法的第二个参数除了可以是数组外,从 ECMAScript 第5版开始,还可以是一个类数组对象:

从 ECMAScript 第5版开始,可以使用任何种类的类数组对象,就是说只要有一个 length 属性和(0..length-1)范围的整数属性。例如现在可以使用 NodeList 或一个自己定义的类似{'length': 2, '0': 'eat', '1': 'bananas'} 形式的对象。

有的时候,我们需要初始化一个指定长度的数组,但又希望不仅仅只有length属性,却没有实际元素。
例如,Array(6)返回的是(6)[empty × 6],也就是一个长度为6的空数组。因为它没有实际的元素,所以不能使用循环mapsort等对它操作。这时候就可以使用apply和类数组对象初始化数组
Array.apply(null, {length: 6})
返回:
[undefined, undefined, undefined, undefined, undefined, undefined]
其中,Arraynew Array结果是一样的。因为apply的第二个参数类数组对象只提供了length,所以创建的数组每个元素都是undefined。这有什么用呢?

有一个从接口获取的数组arr
[
{ id: 1, name: 'a' },
{ id: 2, name: 'b' },
{ id: 3, name: 'c' },
]
希望创建一个长度等于arr,元素是arrname的新数组,可以这样写:
var newArr = [], len = arr.length;
for(var i = 0; i < len; i++){
newArr.push(arr[i].name);
}
如果用apply就可以这样写:
Array.apply(null, { length: arr.length }).map(function(value, index){
return arr[index].name;
});

标签: apply, 类数组对象