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

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

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

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

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

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

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

#1楼

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

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);

通过几回随意运行后,此代码将产生如下内容: spa

$ 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、一、二、三、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]

相关文章
相关标签/搜索