Javascript Как определить несколько переменных в одной строке?

105

Читая документацию в Интернете, я не понимаю, как правильно определить несколько переменных JavaScript в одной строке.

Если я хочу сжать следующий код, каков правильный "строгий" способ JavaScript для определения нескольких переменных javascript в одной строке?

var a = 0;
var b = 0;

Это:

var a = b = 0;

или

var a = var b = 0; 

и т.д...

HeatherK
источник
1
Подробнее о множественном присваивании: как присваивание переменных работает в JavaScript? . Я считаю, что этот шаблон полезен внутри замыкания для раскрытия функций конструктора:var $cls = my.namespace.Foo = function(args){ ... }
blong
Интересно, почему вы вообще хотите это конденсировать. ИМХО, объявлять и назначать одну переменную за другой намного яснее и легче для понимания.
Henning

Ответы:

76

Вы хотите полагаться на запятые, потому что, если вы полагаетесь на конструкцию множественного назначения, вы в тот или иной момент выстрелите себе в ногу.

Примером может быть:

>>> var a = b = c = [];
>>> c.push(1)
[1]
>>> a
[1]

Все они относятся к одному и тому же объекту в памяти, они не являются «уникальными», поскольку каждый раз, когда вы делаете ссылку на объект (массив, литерал объекта, функцию), он передается по ссылке, а не по значению. Поэтому, если вы измените только одну из этих переменных и захотите, чтобы они действовали индивидуально, вы не получите того, что хотите, потому что они не являются отдельными объектами.

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

(function() {  var a = global = 5 })();
alert(window.global) // 5

Лучше всего использовать запятые и желательно с большим количеством пробелов, чтобы его можно было прочитать:

var a = 5
  , b = 2
  , c = 3
  , d = {}
  , e = [];
Медер Омуралиев
источник
2
Это действительно проблема с назначением ссылок на массив в целом, а не только с операторами присваивания в качестве значений.
Мэтью Флашен,
«Так что, пока вы можете обойтись несколькими назначениями правой руки для таких вещей, как числовые литералы»,
медер омуралиев
1
@meder, это проблема с любыми заданиями. В правой руке нет ничего особенного.
Мэтью Флашен,
Я имел в виду задания в целом. Отредактированная редакция.
медер омуралиев
2
При использовании этого шаблона множественного назначения следует иметь в виду, что любое необъявленное назначение в строгом режиме ES5 вызовет ReferenceErrorисключение ... ИМО, их следует избегать ...
Кристиан С. Сальвадо,
68

Используя Javascript es6 или node, вы можете сделать следующее:

var [a,b,c,d] = [0,1,2,3]

И если вы хотите легко распечатать несколько переменных в одной строке, просто сделайте следующее:

console.log(a, b, c, d)

0 1 2 3

Это похоже на ответ @alex gray здесь, но этот пример написан на Javascript, а не на CoffeeScript.

Обратите внимание, что это использует назначение деструктуризации массива Javascript

модули
источник
3
почему бы console.log(a,b,c,d)вместо этого не использовать в этом случае? он короче и дает тот же результат
Джош Бродхерст
44

Невозможно сделать это в одной строке с присвоением значения.

var a = b = 0;

делает b глобальным. Правильный способ (без утечки переменных) немного длиннее:

var a = 0, b = a;

что полезно в случае:

var a = <someLargeExpressionHere>, b = a, c = a, d = a;
Мэтью Флашен
источник
1
«Невозможно использовать присвоение как значение без повторения 0». - что вы имеете в виду?
palswim
28

Почему бы не сделать это в две строчки?

var a, b, c, d;    // All in the same scope
a = b = c = d = 1; // Set value to all.

Причина в том, чтобы сохранить локальную область видимости в объявлениях переменных, например:

var a = b = c = d = 1;

приведет к неявным декларациям b, cи dна оконной области.

Ник Л.
источник
Это было полезно для меня, потому что я заранее объявляю много переменных в своей программе. Теперь вместо 30+ строк я могу использовать несколько строк без ущерба для читабельности.
Калиф Вон,
11

Вот новый метод ES6 для объявления нескольких переменных в одной строке:

const person = { name: 'Prince', age: 22, id: 1 };

let {name, age, id} = person;

console.log(name);
console.log(age);
console.log(id);

* Имя вашей переменной и индекс объекта должны совпадать

Принц Ахмед
источник
2
Это длиннее, чем вопрос OP, потому что он эквивалентен let { a, b } = { a: 0, b: 0 }.
Дэн Даскалеску 05
4

В частности, к тому, что спросил OP, если вы хотите инициализировать N переменных с одним и тем же значением (например 0), вы можете использовать деструктуризацию массива и Array.fill, чтобы присвоить переменным массив из N 0s:

let [a, b, c, d] = Array(4).fill(0);

console.log(a, b, c, d);

Дэн Даскалеску
источник
0

обратите внимание, вы можете делать это только с числами и строками

ты мог бы сделать ...

var a, b, c; a = b = c = 0; //but why?

c++;
// c = 1, b = 0, a = 0;
КПК
источник