Javascript Come definire più variabili su una singola riga?


103

Leggendo la documentazione in linea, mi sto confondendo come definire correttamente più variabili JavaScript su una singola riga.

Se voglio condensare il codice seguente, qual è il modo "rigoroso" JavaScript corretto per definire più variabili javascript su una singola riga?

var a = 0;
var b = 0;

È:

var a = b = 0;

o

var a = var b = 0; 

eccetera...


1
Ulteriori informazioni sull'assegnazione multipla: come funziona l'assegnazione delle variabili in JavaScript? . Trovo questo pattern utile all'interno di una chiusura per esporre le funzioni del costruttore:var $cls = my.namespace.Foo = function(args){ ... }
blong

Mi chiedo perché vuoi condensarlo in primo luogo. IMHO dichiarare e assegnare un variabler dopo l'altro è molto più chiaro e più facile da capire per chiunque.
Henning

Risposte:


76

Vuoi fare affidamento sulle virgole perché se ti affidi al costrutto di assegnazione multipla, ti sparerai ai piedi in un punto o nell'altro.

Un esempio potrebbe essere:

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

Si riferiscono tutti allo stesso oggetto in memoria, non sono "univoci" poiché ogni volta che si fa riferimento a un oggetto (array, oggetto letterale, funzione) viene passato per riferimento e non per valore. Quindi, se modifichi solo una di queste variabili e desideri che agiscano individualmente, non otterrai ciò che desideri perché non sono oggetti individuali.

C'è anche uno svantaggio nell'assegnazione multipla, in quanto le variabili secondarie diventano globali e non si vuole perdere nello spazio dei nomi globale.

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

È meglio usare solo virgole e preferibilmente con molti spazi in modo che sia leggibile:

var a = 5
  , b = 2
  , c = 3
  , d = {}
  , e = [];

2
Questo è davvero un problema con l'assegnazione di riferimenti ad array in generale, non solo con le istruzioni di assegnazione come valori.
Matthew Flaschen

"Quindi, anche se puoi farla
franca

1
@meder, è un problema con qualsiasi incarico. Non c'è niente di speciale nella mano destra.
Matthew Flaschen

Intendevo incarichi in generale. Formulazione modificata.
meder omuraliev

2
Qualcosa da tenere a mente con questo schema di assegnazione multipla è che qualsiasi incarico non dichiarato, in ES5 Strict Mode, causerà ReferenceErrorun'eccezione ... IMO, dovrebbero essere evitati ...
CMS

64

Utilizzando es6 o nodo di Javascript, puoi eseguire le seguenti operazioni:

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

E se vuoi stampare facilmente più variabili in una singola riga, fallo semplicemente:

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

0 1 2 3

Questo è simile alla risposta di @alex gray qui, ma questo esempio è in Javascript invece che in CoffeeScript.

Si noti che questo utilizza l' assegnazione di destrutturazione dell'array di Javascript


2
perché non utilizzare console.log(a,b,c,d)in questo caso invece? è più breve e dà la stessa uscita
Josh Broadhurst

44

Non c'è modo di farlo in una riga con l'assegnazione come valore.

var a = b = 0;

rende b globale. Un modo corretto (senza perdite di variabili) è leggermente più lungo:

var a = 0, b = a;

che è utile nel caso:

var a = <someLargeExpressionHere>, b = a, c = a, d = a;

1
"Non è possibile utilizzare l'assegnazione come valore senza ripetere 0." - cosa intendi?
palswim

28

Perché non farlo in due righe?

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

Il motivo è preservare l'ambito locale sulle dichiarazioni di variabili, come questo:

var a = b = c = d = 1;

porterà alle dichiarazioni implicite di b, ce dsul campo di applicazione della finestra.


Questo è stato utile per me perché dichiaro molte variabili in anticipo nel mio programma. Ora, invece di prendere più di 30 righe, posso usare poche righe senza sacrificare la leggibilità.
Kalif Vaughn,

11

Ecco il nuovo metodo ES6 per dichiarare più variabili in una riga:

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

let {name, age, id} = person;

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

* Il nome della variabile e l'indice dell'oggetto devono essere gli stessi


2
È più lungo della domanda dell'OP, perché è equivalente a let { a, b } = { a: 0, b: 0 }.
Dan Dascalescu

4

Nello specifico di quanto richiesto dall'OP, se si desidera inizializzare N variabili con lo stesso valore (es. 0), È possibile utilizzare la destrutturazione di array e Array.fill per assegnare alle variabili un array di N 0s:

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

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


0

nota che puoi farlo solo con numeri e stringhe

potresti fare ...

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

c++;
// c = 1, b = 0, a = 0;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.