Javascript Як визначити кілька змінних в одному рядку?


103

Читаючи документацію в Інтернеті, я заплутався, як правильно визначити кілька змінних JavaScript в одному рядку.

Якщо я хочу стиснути наступний код, який правильний "строгий" спосіб визначення JavaScript в одному рядку?

var a = 0;
var b = 0;

Є це:

var a = b = 0;

або

var a = var b = 0; 

тощо ...


1
Детальніше про багаторазове призначення: Як працює змінне призначення в JavaScript? . Я вважаю цей шаблон корисним для закриття для викриття конструкторських функцій:var $cls = my.namespace.Foo = function(args){ ... }
blong

Цікаво, чому ти хочеш це в першу чергу конденсувати. IMHO, декларуючи та призначаючи одну змінну за іншою, набагато зрозуміліше і зрозуміліше для когось.
Геннінг

Відповіді:


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
Це справді проблема із призначенням масивів посилань взагалі, а не лише з операторами призначення як значеннями.
Метью Флашен

"Тож поки ви можете піти з декількох завдань правою рукою для таких речей, як числові літерали"
meder omuraliev

1
@meder, це проблема з будь-якими завданнями. У правій руці немає нічого особливого.
Метью Флашен

Я мав на увазі завдання взагалі. Відредаговано формулювання.
meder omuraliev

2
Що слід пам’ятати з цією схемою декількох присвоєнь, це те, що будь-яке незадеклароване призначення в умовах жорсткого режиму ES5 спричинить ReferenceErrorвиняток ... ІМО, їх слід уникати ...
CMS

64

За допомогою es6 або вузла Javascript ви можете зробити наступне:

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

А якщо ви хочете легко надрукувати кілька змінних в одному рядку, просто зробіть це:

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

0 1 2 3

Це схоже на відповідь @alex grey тут, але цей приклад є у Javascript замість CoffeeScript.

Зауважте, що для цього використовується завдання деструктування масиву Javascript


2
чому б не використовувати 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
Це довше, ніж питання щодо ОП, тому що це рівнозначно let { a, b } = { a: 0, b: 0 }.
Дан Даскалеску

4

Зокрема, до того, що запитував ОП, якщо ви хочете ініціалізувати 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;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.