我阅读过的有关JavaScript数组的大多数教程(包括w3schools和devguru )都建议您可以通过使用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 () {})
为您提供了一个长度为5Array.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]
来源:oschina
链接:https://my.oschina.net/u/3797416/blog/3160437