我阅读过的有关JavaScript数组的大多数教程(包括w3schools和devguru )都建议您能够经过使用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;
如上所述,使用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; }
(这多是更好的评论,但时间太长了) 函数
所以,看完这篇文章后,我很好奇预分配其实是否更快,由于从理论上讲应该如此。 可是,此博客提供了一些建议,建议不要使用它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
令我惊讶的是,尚未一个功能性的解决方案可让您在一行中设置长度。 如下基于UnderscoreJS:
var test = _.map(_.range(4), function () { return undefined; }); console.log(test.length);
因为上述缘由,除非我想将数组初始化为特定值,不然我将避免这样作。 有趣的是,还有其余实现范围的库,包括Lo-dash和Lazy,它们可能具备不一样的性能特征。
var arr=[]; arr[5]=0; alert("length="+arr.length); // gives 6
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]