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

发布时间:2019-08-12 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了创建全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@H_126_85@[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(@H_360_199@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)的方法不一定是最好的啊

脚本宝典总结

以上是脚本宝典为你收集整理的创建全0数组(Zero filled array creation)全部内容,希望文章能够帮你解决创建全0数组(Zero filled array creation)所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。