我在JavaScript中读到的大多数关于数组的教程(包括w3schools和devguru)都建议,通过使用vartest=newArray(4)将整数传递给array构造函数,可以初始化具有一定长度的数组;语法。
在我的js文件中大量使用了这种语法后,我通过jsLint运行了其中一个文件,结果发现:
错误:第1行第22个字符出现问题:应为“)”,但看到的却是“4”。var test=新阵列(4);第1行第23个字符出现问题:应为“;”而是看到“)”。var test=新阵列(4);第1行第23个字符出现问题:应为标识符,但看到的却是“)”。
在阅读了jsLint对其行为的解释之后,jsLint似乎并不真正喜欢新的Array()语法,而是在声明数组时更喜欢[]。
所以我有几个问题:
首先,为什么?改用新的Array()语法是否会有风险?我是否应该注意到浏览器不兼容?
第二,如果我切换到方括号语法,是否有任何方法声明数组并将其长度全部设置在一行上,或者我必须这样做:
var test = [];
test.length = 4;
这是另一个解决方案
var arr = Array.apply( null, { length: 4 } );
arr; // [undefined, undefined, undefined, undefined] (in Chrome)
arr.length; // 4
apply()的第一个参数是this对象绑定,这里我们不关心它,所以我们将其设置为null。
Array.apply(..)正在调用Array(..)函数,并将{length:3}对象值作为其参数展开。
ES6引入了Array.from,它允许您从任何“类数组”或可迭代对象创建Array:
Array.from({length: 10}, (x, i) => i);
// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
在这种情况下,{length:10}表示“类数组”对象的最小定义:一个只定义了长度属性的空对象。
Array.from允许第二个参数映射到结果数组上。
最简单的形式是使用
Array.from({ length: 3 });
// gives you
[undefined, undefined, undefined]
与Array(3)不同,它将为您提供一个无法迭代的数组。from({length})为您提供了一个可以轻松迭代的数组。
Array.from({ length: 3 }).map((e, idx) => `hi ${idx}`);
// ['hi 1', 'hi 2', 'hi 3']