建立全0数组(Zero filled array creation)

题目

乍看之下,建立全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)的要领不一定是最好的啊

    原文作者:隐约雷鸣
    原文地址: https://segmentfault.com/a/1190000003861423
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞