创建包含n
个元素的数组,并初始化为0
,
Array.apply(null,Array(n)).map(function(v, i){
return 0;
});
原理:
(1)Array
如果只接受一个数字作为参数Array(3)
,Chrome中结果为[undefined × 3]
,表示具有3个空位。
(2)利用apply
可以传一个数组作为多个参数的办法,Apply.apply(null,Array(3))
传递了3个undefined
作为参数调用Array(undefined,...,undefined)
,这样会用这些undefined
初始化一个新数组,元素分别为undefined
。
(3)最后用map
来做数组元素的映射。
注:
(1)一个参数Array(3)
和两个参数Array(3,1)
是不同的,
Array(3) // [undefined × 3]
Array(3,1) // [3, 1]
(2)数组的空位
[undefined × 3]
与[undefined,undefined,undefined]
是不同的,虽然length
都为3
。
除了Array(3)
之外,[,,,]
也是一种创造数组空位的办法,
由于数组元素的最后一个逗号会省略,所以,
[,,,] // [undefined × 3]
对空位来说,forEach
会跳过它,元素没有索引属性,
['a',,'b'] // ["a", undefined × 1, "b"]
['a',,'b'].length // 3
['a',,'b'][1] // undefined
0 in ['a',,'b'] // true
1 in ['a',,'b'] // false
['a',,'b'][2] // b
['a',,'b'].forEach(function(v){console.log(v);}); //a b
(3)对空位的处理
ES5对空位的处理,很不一致,大多数情况下会忽略空位。
forEach
,filter
,every
,some
都会跳过空位。
map
,会跳过空位,但会保留这个值,
join
,toString
会将空位视为undefined
,而undefined
和null
会被处理成空字符串。
ES6则是明确将空位转为undefined
:
Array.from
方法会将数组的空位,转为undefined
,见(4)。
扩展运算符...
也会将空位转为undefined
,见(5)。
copyWithin
会连空位一起拷贝。
fill
会将空位视为正常的数组位置。
for...of
循环也会遍历空位。
entries
,keys
,values
,find
,findIndex
会将空位处理成undefined
。
(4)Array.apply
可以用ES6的Array.from
代替,
Array.from(Array(3)); // [undefined, undefined, undefined]
(5)另外一个简单的办法,是使用数组的解构运算符...
,
[...Array(3).keys()] // [0, 1, 2]
其中,.keys()
返回一个iterator,而[...iterator]
将得到一个新的数组。
let iter=['a', 'b'].keys();
iter.next(); //{value:0,done:false}
iter.next(); //{value:1,done:false}
iter.next(); //{value:undefined,done:true}
总结:
Array(3) // [undefined × 3]
Array.apply(null, Array(3)) // [undefined, undefined, undefined]
Array.from(Array(3)) // [undefined, undefined, undefined]
[...Array(3).keys()] // [0, 1, 2]
网友评论