[JavaScript]使用apply和类数组对象初始化数组
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的空数组。因为它没有实际的元素,所以不能使用循环、map、sort等对它操作。这时候就可以使用apply和类数组对象初始化数组:
Array.apply(null, {length: 6})
返回:
[undefined, undefined, undefined, undefined, undefined, undefined]
其中,Array
和new Array
结果是一样的。因为apply
的第二个参数类数组对象只提供了length
,所以创建的数组每个元素都是undefined
。这有什么用呢?
有一个从接口获取的数组arr
:
[
{ id: 1, name: 'a' },
{ id: 2, name: 'b' },
{ id: 3, name: 'c' },
]
希望创建一个长度等于arr
,元素是arr
的name
的新数组,可以这样写:
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;
});