资讯专栏INFORMATION COLUMN

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

Rindia / 1731人阅读

摘要:扩展这位老兄的答案中附上了一个非常狂野的方法这段代码可以创建出一个长度为的全数组。创建全数组测试看来有时候优雅的方法不一定是最好的啊

问题

乍看之下,创建全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://www.ucloud.cn/yun/86067.html

相关文章

  • Node Buffer解读

    摘要:是什么存在于全局对象上,无需引入模块即可使用,可见重要性非同一般。可以理解是在内存中开辟的一片区域,用于存放二进制数据。大小通过参数指定,默认情况下是。一般情况下位系统大约是,位系统大约是。 Buffer是什么? Buffer存在于全局对象上,无需引入模块即可使用,可见重要性非同一般。可以理解Buffer是在内存中开辟的一片区域,用于存放二进制数据。Buffer所开辟的是堆外内存。 B...

    Zack 评论0 收藏0
  • Javascripts数组原生方法集合

    摘要:如果数组已经为空,则不改变数组,并返回值。中所有在数组被修改时都遵从这个原则,以下不再重复方法会给原数组中的每个元素都按顺序调用一次函数。每次执行后的返回值没有指定返回值则返回组合起来 数组应该是我们在写程序中应用到最多的数据结构了,相比于无序的对象,有序的数组帮我们在处理数据时,实在是帮了太多的忙了。今天刚好看到一篇Array.include的文章,忽然发现经过几个ES3,ES5,E...

    awokezhou 评论0 收藏0
  • 20170605-Array相关方法

    摘要:方法将所有在过滤函数中返回的数组元素放进一个新数组中并返回。方法从左到右为每个数组元素执行一次回调函数,并把上次回调函数的返回值放在一个暂存器中传给下次回调函数,并返回最后一次回调函数的返回值。 创建数组 var array = new Array(); var array = new Array(10); var array = new Array(red,blue,green);...

    Chaz 评论0 收藏0
  • Javascript 数组方法解析(包含es6,es7)

    摘要:数组方法全解析包含数组自带属性返回创建数组对象的原型函数返回数组对象的长度这个是老熟人了,可以增加数组的原型方法和属性,这个放在后面的继承中讲数组的方法首先让我们看看数组的对象属性。 Javascript 数组方法全解析(包含es6) 1. 数组自带属性 constructor //返回创建数组对象的原型函数 length //返回数组对象的长度 prototype //这个是老...

    zxhaaa 评论0 收藏0
  • 【深度长文】JavaScript数组所有API解密

    摘要:关于我的博客掘金专栏路易斯专栏原文链接深度长文数组全解密全文共字,系统讲解了数组的各种特性和。构造器构造器用于创建一个新的数组。中声明的数组,它的构造函数是中的对象。 本文首发于CSDN网站,下面的版本又经过进一步的修订。 关于 我的博客:louis blog 掘金专栏:路易斯专栏 原文链接:【深度长文】JavaScript数组全解密 全文共13k+字,系统讲解了JavaScrip...

    Mr_zhang 评论0 收藏0

发表评论

0条评论

Rindia

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<