Объявите несколько переменных в JavaScript - PullRequest
36 голосов
/ 03 ноября 2010

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

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();

Ответы [ 4 ]

70 голосов
/ 03 ноября 2010

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

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

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 внутри.Во втором, так как я определил уникальные массивы для каждой переменной, поэтому, когда я нажал на одну, два не были затронуты.

17 голосов
/ 03 ноября 2010

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

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

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

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's 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's variables no longer exist.
typeof foo; // "undefined"
typeof bar; // "undefined"
typeof baz; // "undefined"
typeof xxx; // "undefined"
1 голос
/ 03 ноября 2010

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

var src_arr     = [],
    caption_arr = [],
    fav_arr     = [],
    hidden_arr  = [];
0 голосов
/ 03 ноября 2010

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

...