Подтвердить что ты не робот

Объявить несколько переменных в JavaScript

Я хочу объявить несколько переменных в функции:

function foo() {
    var src_arr     = new Array();
    var caption_arr = new Array();
    var fav_arr     = new Array();
    var hidden_arr  = new Array();
}

Правильно ли это делается?

var src_arr = caption_arr = fav_arr = hidden_arr = new Array();
4b9b3361

Ответ 1

Да, это , если вы хотите, чтобы все они указывали на один и тот же объект в памяти, но, скорее всего, вы хотите, чтобы они были отдельными массивами, чтобы, если кто-то мутировал, другие не пострадали.

Если вы не хотите, чтобы все они указывали на один и тот же объект, сделайте

var one = [], two = [];

[] - сокращенный литерал для создания массива.

Вот консольный журнал, который указывает на разницу:

>> one = two = [];
[]
>> one.push(1)
1
>> one
[1]
>> two
[1]
>> one = [], two = [];
[]
>> one.push(1)
1
>> one
[1]
>> two
[]

В первой части я определил one и two, чтобы указать один и тот же объект/массив в памяти. Если я использую метод .push, он подталкивает 1 к массиву, и поэтому оба one и two имеют 1 внутри. Во втором, поскольку я определил уникальные массивы на переменную, поэтому, когда я нажал на один, два не были затронуты.

Ответ 2

Пожалуйста, держитесь подальше от этого шаблона назначения, даже если вы хотите, чтобы все переменные указывали на один и тот же объект.

Фактически, только первая будет объявлением переменной , остальные - просто присваивания возможно необъявленным идентификаторам!

Присвоение значения необъявленному идентификатору (aka uneclared assign) сильно обескураживается, потому что, если идентификатор не найден в цепочке областей видимости, будет создана глобальная переменная. Например:

function test() {
    // We intend these to be local variables of 'test'.
    var foo = bar = baz = xxx = 5;
    typeof foo; // "number", while inside 'test'.
}
test();

// Testing in the global scope. test variables no longer exist.
typeof foo; // "undefined", As desired, but,
typeof bar; // "number", BAD!, leaked to the global scope.
typeof baz; // "number"
typeof xxx; // "number"

Кроме того, 5-й строковый режим ECMAScript запрещает подобные назначения. В строгом режиме назначение, сделанное для не объявленного идентификатора, приведет к исключению TypeError, чтобы предотвратить предполагаемые глобальные переменные.

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

function test() {
    // We correctly declare these to be local variables inside 'test'.
    var foo, bar, baz, xxx;
    foo = bar = baz = xxx = 5;
}
test();

// Testing in the global scope. test variables no longer exist.
typeof foo; // "undefined"
typeof bar; // "undefined"
typeof baz; // "undefined"
typeof xxx; // "undefined"

Ответ 3

Нет, ваш второй оператор создаст четыре ссылки на один и тот же массив. Вы хотите:

var src_arr     = [],
    caption_arr = [],
    fav_arr     = [],
    hidden_arr  = [];

Ответ 4

Все эти переменные будут ссылаться на один объект Array.

Ответ 5

Для любых целей следует использовать literal [] синтаксисобозначений. Поскольку конструктор массива неоднозначен в отношении своих параметров.

Из документов:

Если единственный аргумент, переданный конструктору Array, является целым числом от 0 до 232-1 (включительно), это возвращает новый массив JavaScript со свойством длины, установленным на это число. И это подразумевает Array из переданной длины пустых слотов со значениями undefined.

new Array(1, 2, 3); // Result: [1, 2, 3]
new Array(3); // Result: [empty × 3] with undefined at indexes
new Array('3') // Result: ['3']

//this was ambiguous
let x = new Array(5); // Result: [empty × 5]
x.push("Hello"); //expected x as ["Hello", empty, empty, empty, empty]
//Actual x: [empty × 5, "Hello"]

Разрушающий синтаксис:

Другой более точный способ объявления нескольких переменных - использование назначения деструктурирования, которое позволяет распаковывать значения из массивов или свойства из объектов в отдельные переменные.

function foo() {
  //destructuring assignment syntax
  let [src_arr, caption_arr, fav_arr, hidden_arr] = [[], [], [], []];

  console.info("Variables::", fav_arr, hidden_arr, caption_arr, src_arr);

  fav_arr.push("fav");
  hidden_arr.push("hidden");

  //After adding some values to couple of arrays
  console.info("Variables::", fav_arr, hidden_arr, caption_arr, src_arr);
}

foo();