如何在JavaScript中初始化数组的长度?

社会主义新天地 提交于 2020-02-26 02:36:00

我阅读过的有关JavaScript数组的大多数教程(包括w3schoolsdevguru )都建议您可以通过使用var test = new Array(4);将整数传递给Array构造函数来初始化具有一定长度的数组var test = new Array(4); 句法。

在我的js文件中自由使用此语法后,我通过jsLint运行了其中一个文件,结果很糟糕

错误:第1行第22个字符处出现问题:预期为“)”,而是看到了“ 4”。
var test = new Array(4);
第1行第23个字元的问题:预期为';' 而是看到')'。
var test = new Array(4);
第1行第23个字符处的问题:需要一个标识符,而看到了')'。

阅读完jsLint对其行为的解释之后 ,看起来jsLint并不真正喜欢new Array()语法,而是在声明数组时更喜欢[]

所以我有几个问题。 首先,为什么? 通过使用new Array()语法是否会冒任何风险? 我应该注意浏览器的不兼容性吗? 其次,如果我切换到方括号语法,是否有任何方法可以声明一个数组并将其长度全部设置在一行上,或者我必须执行以下操作:

var test = [];
test.length = 4;

#1楼

如上所述,使用new Array(size)有点危险。 而不是直接使用它,而是将其放在“数组创建器函数”中。 您可以轻松地确保此函数没有错误,并且避免了直接调用new Array(size)的危险。 另外,您可以为其提供可选的默认初始值。 此createArray函数正是这样做的:

function createArray(size, defaultVal) {
    var arr = new Array(size);
    if (arguments.length == 2) {
        // optional default value
        for (int i = 0; i < size; ++i) {
            arr[i] = defaultVal;
        }
    }
    return arr;
}

#2楼

(这可能是更好的评论,但时间太长了)

因此,看完这篇文章后,我很好奇预分配实际上是否更快,因为从理论上讲应该如此。 但是,此博客提供了一些建议,建议不要使用它http://www.html5rocks.com/en/tutorials/speed/v8/

因此仍然不确定,我将其进行了测试。 事实证明,它似乎实际上要慢一些。

var time = Date.now();
var temp = [];
for(var i=0;i<100000;i++){
    temp[i]=i;
}
console.log(Date.now()-time);


var time = Date.now();
var temp2 = new Array(100000);
for(var i=0;i<100000;i++){
    temp2[i] = i;
}
console.log(Date.now()-time); 

经过几次随意运行后,此代码将产生以下内容:

$ node main.js 
9
16
$ node main.js 
8
14
$ node main.js 
7
20
$ node main.js 
9
14
$ node main.js 
9
19

#3楼

令我惊讶的是,还没有一个功能性的解决方案可以让您在一行中设置长度。 以下基于UnderscoreJS:

var test = _.map(_.range(4), function () { return undefined; });
console.log(test.length);

由于上述原因,除非我想将数组初始化为特定值,否则我将避免这样做。 有趣的是,还有其他实现范围的库,包括Lo-dash和Lazy,它们可能具有不同的性能特征。


#4楼

var arr=[];
arr[5]=0;
alert("length="+arr.length); // gives 6

#5楼

  • Array(5)为您提供长度为5但没有值的数组,因此您无法对其进行迭代。

  • Array.apply(null, Array(5)).map(function () {})为您提供了一个长度为5 Array.apply(null, Array(5)).map(function () {})定义为值的数组,现在可以对其进行迭代。

  • Array.apply(null, Array(5)).map(function (x, i) { return i; })提供长度为5且值为0、1、2、3、4的数组。

  • Array(5).forEach(alert)不执行任何操作, Array.apply(null, Array(5)).forEach(alert)给您5条警报

  • ES6为我们提供了Array.from因此现在您还可以使用Array.from(Array(5)).forEach(alert)

  • 如果您想使用某个值进行初始化,那么这些都是很好的认识...
    Array.from('abcde')Array.from('x'.repeat(5))
    Array.from({length: 5}, (v, i) => i) // gives [0, 1, 2, 3, 4]

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!