乍看之下,建立全0数组应该是一件不能再简单的事情了:javascript
var arr = [0,0,0,0,0,0];
然而有时候须要建立出长度比较长的全0数组(好比作桶排序时就须要),这种字面声明可能就不太适合,由于不可能手打出几万个0。因此今天建立全0数组的时候,我用了如下方法:java
var arr = new Array(10); //这里等同于 //var arr = [];arr.length = 10; arr = arr.map(function(value,index,array){ return value = 0; });
而后对于arr
里的元素都进行了++
处理:数组
arr[i]++;
最后console.log(arr)
的时候却发现,结果是:app
[NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN]
当时还觉得本身map
函数写错了,因而想了一个方法来验证:jsp
var arr = [1,2,3,4,5,6,7,8,9,10]; arr = arr.map(function(value,index,array){ return value = 0; }); console.log(arr);
结果获得了[0,0,0,0,0,0,0,0,0,0];
函数
也就是说,使用new
方法声明的数组,无法用map
方法初始化每个值性能
就着这个问题去网上搜索答案,结果在Stackoverflow - Most efficient way to create a zero filled JavaScript array?中找到了一些参考。在友人zertosh
的答案的评论中,他解释了:测试
当你用
new
关键字加上某个长度来建立数组的时候,你建立的是相似于{ length: 5, __proto__: Array.prototype }
的东西,而不是{0:0, 1:0, 2:0, 3:0 length: 3, __proto__: Array.prototype }
的通常数组的样子,也就是说里面徒有数组长度,却一个数组元素都没有。这样在调用map
等函数的时候,因为数组里没有一个元素,因此也就不能对数组的元素进行操做。prototype
这位老兄的答案中附上了一个很是狂野的方法:code
Array.apply(null, Array(5)).map(Number.prototype.valueOf,0);
这段代码能够建立出一个长度为5的全0数组。由于兴趣因此我搜索了其余建立全0数组的代码放在下面:
new Array(5+1).join('0').split('')
var ary = new Uint8Array(10);
//ES6添加的fill方法 var arr = new Array(10); arr.fill(0);
固然少不了最简单粗暴的:
var arr = [];for(var n = 0; n < 100; n++) arr[n] = 0
有网友测试了上述方法的性能,结果发现原来简单粗暴的arr[n] = 0
的性能是最好的,哪怕你用arr.push(0)
都弱爆了。建立全0数组测试 - jsperf.com
看来有时候优(zhuang)雅(bi)的方法不必定是最好的啊