Объявить несколько переменных в 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();
Ответы
Ответ 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();