Javascript Como definir várias variáveis ​​em uma única linha?

103

Lendo a documentação online, estou ficando confuso sobre como definir corretamente várias variáveis ​​JavaScript em uma única linha.

Se eu quiser condensar o código a seguir, qual é a maneira "estrita" adequada do JavaScript para definir várias variáveis ​​javascript em uma única linha?

var a = 0;
var b = 0;

É isso:

var a = b = 0;

ou

var a = var b = 0; 

etc ...

HeatherK
fonte
1
Mais sobre atribuição múltipla: Como funciona a atribuição de variável em JavaScript? . Acho esse padrão útil dentro de um encerramento para expor funções do construtor:var $cls = my.namespace.Foo = function(args){ ... }
blong
Eu me pergunto por que você quer condensá-lo em primeiro lugar. IMHO declarar e atribuir uma variável após a outra é muito mais claro e fácil de entender para qualquer pessoa.
Henning

Respostas:

76

Você quer contar com vírgulas porque, se contar com a construção de atribuições múltiplas, vai dar um tiro no próprio pé em um ponto ou outro.

Um exemplo seria:

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

Todos eles se referem ao mesmo objeto na memória, eles não são "únicos", pois sempre que você faz uma referência a um objeto (array, objeto literal, função) é passado por referência e não por valor. Portanto, se você alterar apenas uma dessas variáveis ​​e quiser que elas ajam individualmente, não obterá o que deseja porque elas não são objetos individuais.

Também há uma desvantagem na atribuição múltipla, em que as variáveis ​​secundárias se tornam globais e você não quer vazar para o namespace global.

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

É melhor usar apenas vírgulas e de preferência com muitos espaços em branco para que seja legível:

var a = 5
  , b = 2
  , c = 3
  , d = {}
  , e = [];
Meder Omuraliev
fonte
2
Esse é realmente um problema com a atribuição de referências de array em geral, não apenas com instruções de atribuição como valores.
Matthew Flaschen
"Assim, embora você possa se safar com várias atribuições para a mão direita para coisas como literais numéricos"
meder omuraliev
1
@meder, é um problema com qualquer atribuição. Não há nada de especial na mão direita.
Matthew Flaschen
Eu quis dizer atribuições em geral. Redação editada.
meder omuraliev
2
Algo para se ter em mente com este padrão de atribuição múltipla é que qualquer atribuição não declarada, no Modo Estrito ES5, causará uma ReferenceErrorexceção ... IMO, eles devem ser evitados ...
CMS
64

Usando o es6 ou nó do Javascript, você pode fazer o seguinte:

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

E se você quiser imprimir facilmente várias variáveis ​​em uma única linha, basta fazer o seguinte:

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

0 1 2 3

Isso é semelhante à resposta de @alex gray aqui, mas este exemplo está em Javascript em vez de CoffeeScript.

Observe que isso usa a atribuição de desestruturação de array do Javascript

modulitos
fonte
2
por que não usar console.log(a,b,c,d)neste caso? é mais curto e dá a mesma saída
Josh Broadhurst
44

Não há como fazer isso em uma linha com atribuição como valor.

var a = b = 0;

torna b global. Uma maneira correta (sem vazar variáveis) é ligeiramente mais longa:

var a = 0, b = a;

que é útil no caso:

var a = <someLargeExpressionHere>, b = a, c = a, d = a;
Matthew Flaschen
fonte
1
"Não há como usar atribuição como valor sem repetir 0." - O que você quer dizer?
palswim
28

Por que não fazê-lo em duas linhas?

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

O motivo, é preservar o escopo local nas declarações de variáveis, como este:

var a = b = c = d = 1;

levará às declarações implícitas de b, ce dsobre o âmbito janela.

Nick L.
fonte
Isso foi útil para mim porque eu declaro muitas variáveis ​​antecipadamente em meu programa. Agora, em vez de usar mais de 30 linhas, posso usar algumas linhas sem sacrificar a legibilidade.
Kalif Vaughn
11

Aqui está o novo método ES6 de declaração de múltiplas variáveis ​​em uma linha:

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

let {name, age, id} = person;

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

* Seu nome de variável e índice de objeto precisam ser os mesmos

Príncipe ahmed
fonte
2
Isso é mais longo do que a pergunta do OP, porque é equivalente a let { a, b } = { a: 0, b: 0 }.
Dan Dascalescu
4

Especificamente para o que o OP pediu, se você deseja inicializar N variáveis ​​com o mesmo valor (por exemplo 0), você pode usar a desestruturação de array e Array.fill para atribuir às variáveis ​​um array de N 0s:

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

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

Dan Dascalescu
fonte
0

note que você só pode fazer isso com números e strings

você poderia fazer...

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

c++;
// c = 1, b = 0, a = 0;
PDA
fonte