我在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;

当前回答

最短:

设arr=[…数组(10)];控制台日志(arr);

其他回答

最简单的形式是使用

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']

为什么要初始化长度?理论上没有必要这样做。它甚至会导致混乱的行为,因为所有使用该长度来确定数组是否为空的测试都会报告该数组不为空。一些测试表明,如果随后填充数组,则设置大数组的初始长度可能会更有效,但每个浏览器的性能增益(如果有的话)似乎有所不同。jsLint不喜欢new Array(),因为构造函数不明确。新阵列(4);创建长度为4的空数组。但是新阵列('4');创建包含值“4”的数组。

关于你的评论:在JS中,你不需要初始化数组的长度。它是动态增长的。您可以将长度存储在某个变量中,例如。

var data = [];
var length = 5; // user defined length

for(var i = 0; i < length; i++) {
    data.push(createSomeObject());
}

我很惊讶,没有一个功能性的解决方案可以让你设置一行的长度。以下内容基于UndercoreJS:

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

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

[...Array(6)].map(x => 0);
// [0, 0, 0, 0, 0, 0]

OR

Array(6).fill(0);
// [0, 0, 0, 0, 0, 0]

注意:不能循环空插槽,即Array(4)。forEach(()=>…)


OR

(字体安全)

Array(6).fill(null).map((_, i) => i);
// [0, 1, 2, 3, 4, 5]

OR

使用函数的经典方法(适用于任何浏览器)

function NewArray(size) {
    var x = [];
    for (var i = 0; i < size; ++i) {
        x[i] = i;
    }
    return x;
}

var a = NewArray(10);
// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

创建嵌套阵列

当使用填充直观地创建二维阵列时,应该创建新的实例。但实际发生的情况是,相同的数组将作为引用存储。

var a = Array(3).fill([6]);
// [  [6], [6], [6]  ]

a[0].push(9);
// [  [6, 9], [6, 9], [6, 9]  ]

解决方案

var a = [...Array(3)].map(x => []);

a[0].push(4, 2);
// [  [4, 2], [], []  ]

因此,3x2阵列将如下所示:

[...Array(3)].map(x => Array(2).fill(0));
// [  [0, 0], [0, 0], [0, 0]  ]

N维阵列

function NArray(...dimensions) {
    var index = 0;
    function NArrayRec(dims) {
        var first = dims[0], next = dims.slice().splice(1); 
        if(dims.length > 1) 
            return Array(dims[0]).fill(null).map((x, i) => NArrayRec(next ));
        return Array(dims[0]).fill(null).map((x, i) => (index++));
    }
    return NArrayRec(dimensions);
}

var arr = NArray(3, 2, 4);
// [   [  [ 0,  1,  2,  3 ] , [  4,  5,  6,  7]  ],
//     [  [ 8,  9,  10, 11] , [ 12, 13, 14, 15]  ],
//     [  [ 16, 17, 18, 19] , [ 20, 21, 22, 23]  ]   ]

初始化棋盘

var Chessboard = [...Array(8)].map((x, j) => {
    return Array(8).fill(null).map((y, i) => {
        return `${String.fromCharCode(65 + i)}${8 - j}`;
    });
});

// [ [A8, B8, C8, D8, E8, F8, G8, H8],
//   [A7, B7, C7, D7, E7, F7, G7, H7],
//   [A6, B6, C6, D6, E6, F6, G6, H6],
//   [A5, B5, C5, D5, E5, F5, G5, H5],
//   [A4, B4, C4, D4, E4, F4, G4, H4],
//   [A3, B3, C3, D3, E3, F3, G3, H3],
//   [A2, B2, C2, D2, E2, F2, G2, H2],
//   [A1, B1, C1, D1, E1, F1, G1, H1] ]

数学填充值

处理数学时,简便的小方法过载


function NewArray( size , method, linear )
{
    method = method || ( i => i ); 
    linear = linear || false;
    var x = [];
    for( var i = 0; i < size; ++i )
        x[ i ] = method( linear ? i / (size-1) : i );
    return x;
}

NewArray( 4 ); 
// [ 0, 1, 2, 3 ]

NewArray( 4, Math.sin ); 
// [ 0, 0.841, 0.909, 0.141 ]

NewArray( 4, Math.sin, true );
// [ 0, 0.327, 0.618, 0.841 ]

var pow2 = ( x ) => x * x;

NewArray( 4, pow2 ); 
// [ 0, 1, 4, 9 ]

NewArray( 4, pow2, true ); 
// [ 0, 0.111, 0.444, 1 ]

数组构造函数有一个不明确的语法,JSLint毕竟会伤害你的感情。

此外,如果示例代码损坏,第二个var语句将引发SyntaxError。您正在设置数组测试的属性长度,因此不需要另一个变量。

就您的选择而言,array.length是唯一“干净”的选项。问题是,为什么首先需要设置大小?尝试重构代码以消除这种依赖。