Как инициализировать длину массива в JavaScript? - PullRequest
431 голосов
/ 31 января 2011

Большинство руководств, которые я читал по массивам в JavaScript (включая w3schools и devguru ), предполагают, что вы можете инициализировать массив определенной длины, передав целое число вконструктор 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 1021 * похоже, что jsLint не очень нравится синтаксис new Array(), и вместо этого он предпочитает [] при объявлении массивов.

Итак, у меня есть пара вопросов,Во-первых, почему?Я рискую, используя вместо этого синтаксис new Array()?Существуют ли несовместимости браузеров, о которых мне следует знать?И, во-вторых, если я переключусь на синтаксис в квадратных скобках, есть ли способ объявить массив и задать его длину в одной строке, или я должен сделать что-то вроде этого:

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

Ответы [ 17 ]

7 голосов
/ 28 апреля 2014
var arr=[];
arr[5]=0;
alert("length="+arr.length); // gives 6
6 голосов
/ 31 декабря 2015

Вот еще одно решение

var arr = Array.apply( null, { length: 4 } );
arr;  // [undefined, undefined, undefined, undefined] (in Chrome)
arr.length; // 4

Первый аргумент apply() - это привязка объекта, которая нас здесь не интересует, поэтому мы установили ее на null.

Array.apply(..) вызывает функцию Array(..) и распространяет значение объекта { length: 3 } в качестве аргументов.

3 голосов
/ 31 января 2011

Конструктор массива имеет неоднозначный синтаксис , а JSLint в конце концов просто ранит ваши чувства.

Кроме того, ваш пример кода не работает, второй оператор var вызовет SyntaxError. Вы устанавливаете свойство length массива test, поэтому нет необходимости в другом var.

Что касается ваших возможностей, array.length - единственный "чистый" вариант. Вопрос в том, зачем вам устанавливать размер в первую очередь? Попробуйте реорганизовать свой код, чтобы избавиться от этой зависимости.

2 голосов
/ 23 декабря 2018

Предполагая, что длина массива постоянна.В Javascript это то, что мы делаем:

const intialArray = new Array(specify the value);

2 голосов
/ 04 января 2014

Как объяснено выше, использование 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;
}
0 голосов
/ 09 июня 2017

Вы можете установить длину массива, используя array.length = youValue

Так что это будет

var myArray = [];
myArray.length = yourValue;
0 голосов
/ 31 января 2011

Причина, по которой вы не должны использовать new Array, демонстрируется этим кодом:

var Array = function () {};

var x = new Array(4);

alert(x.length);  // undefined...

Какой-то другой код может связываться с переменной Array. Я знаю, что это немного надумано, что кто-нибудь написал бы такой код, но все же ...

Кроме того, как сказал Феликс Кинг, интерфейс немного противоречив и может привести к некоторым очень трудным для отслеживания ошибкам.

Если вам нужен массив с длиной = x, заполненный неопределенным (как это сделает new Array(x)), вы можете сделать это:

var x = 4;
var myArray = [];
myArray[x - 1] = undefined;

alert(myArray.length); // 4
...