题目
乍看之下,建立全0数组应该是一件不能再简朴的事变了:
var arr = [0,0,0,0,0,0];
但是有时刻须要建立出长度比较长的全0数组(比方做桶排序时就须要),这类字面声明能够就不太合适,因为不能够手打出几万个0。所以本日建立全0数组的时刻,我用了以下要领:
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)
的时刻却发明,效果是:
[NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN]
当时还认为本身map
函数写错了,因而想了一个要领来考证:
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
等函数的时刻,因为数组里没有一个元素,所以也就不能对数组的元素举行操纵。
扩大
这位老兄的答案中附上了一个异常狂野的要领:
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)的要领不一定是最好的啊