Javascript ¿Cómo definir múltiples variables en una sola línea?

103

Al leer la documentación en línea, me confunde cómo definir correctamente varias variables de JavaScript en una sola línea.

Si quiero condensar el siguiente código, ¿cuál es la forma "estricta" de JavaScript adecuada para definir múltiples variables de JavaScript en una sola línea?

var a = 0;
var b = 0;

Lo es:

var a = b = 0;

o

var a = var b = 0; 

etc ...

HeatherK
fuente
1
Más sobre asignación múltiple: ¿Cómo funciona la asignación de variables en JavaScript? . Me parece que este modelo de utilidad dentro de un cierre para exponer funciones constructoras:var $cls = my.namespace.Foo = function(args){ ... }
blong
Me pregunto por qué quiere condensarlo en primer lugar. En mi humilde opinión, declarar y asignar una variable tras otra es mucho más claro y fácil de entender para cualquiera.
Henning

Respuestas:

76

Desea confiar en las comas porque si confía en la construcción de asignación múltiple, se disparará en el pie en un momento u otro.

Un ejemplo sería:

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

Todos se refieren al mismo objeto en la memoria, no son "únicos" ya que cada vez que haces una referencia a un objeto (matriz, objeto literal, función) se pasa por referencia y no por valor. Entonces, si cambia solo una de esas variables y desea que actúen individualmente, no obtendrá lo que desea porque no son objetos individuales.

También hay una desventaja en la asignación múltiple, ya que las variables secundarias se vuelven globales y no desea filtrarse en el espacio de nombres global.

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

Es mejor usar comas y preferiblemente con muchos espacios en blanco para que sea legible:

var a = 5
  , b = 2
  , c = 3
  , d = {}
  , e = [];
meder omuraliev
fuente
2
Eso es realmente un problema con la asignación de referencias de matriz en general, no solo con declaraciones de asignación como valores.
Matthew Flaschen
"Entonces, si bien puede salirse con la suya con múltiples asignaciones de la mano derecha para cosas como literales numéricos"
meder omuraliev
1
@meder, es un problema con cualquier asignación. No hay nada especial en la mano derecha.
Matthew Flaschen
Me refiero a asignaciones en general. Redacción editada.
meder omuraliev
2
Algo a tener en cuenta con este patrón de asignación múltiple es que cualquier asignación no declarada, en el modo estricto de ES5, causará una ReferenceErrorexcepción ... En mi opinión, deben evitarse ...
CMS
64

Usando es6 o nodo de Javascript, puede hacer lo siguiente:

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

Y si desea imprimir fácilmente múltiples variables en una sola línea, simplemente haga esto:

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

0 1 2 3

Esto es similar a la respuesta de @alex gray aquí, pero este ejemplo está en Javascript en lugar de CoffeeScript.

Tenga en cuenta que esto usa la asignación de desestructuración de matrices de Javascript

modulitos
fuente
2
¿Por qué no usarlo console.log(a,b,c,d)en este caso? es más corto y da el mismo resultado
Josh Broadhurst
44

No hay forma de hacerlo en una línea con asignación como valor.

var a = b = 0;

hace b global. Una forma correcta (sin fugas de variables) es la ligeramente más larga:

var a = 0, b = a;

que es útil en el caso:

var a = <someLargeExpressionHere>, b = a, c = a, d = a;
Matthew Flaschen
fuente
1
"No hay forma de utilizar la asignación como valor sin repetir 0". - ¿Qué quieres decir?
palswim
28

¿Por qué no hacerlo en dos líneas?

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

La razón es para preservar el alcance local en declaraciones de variables, como esta:

var a = b = c = d = 1;

dará lugar a las declaraciones implícitas de b, cy dsobre el alcance de la ventana.

Nick L.
fuente
Esto fue útil para mí porque declaro muchas variables por adelantado en mi programa. Ahora, en lugar de tomar más de 30 líneas, puedo usar algunas sin sacrificar la legibilidad.
Kalif Vaughn
11

Aquí está el nuevo método ES6 de declaración de múltiples variables en una línea:

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

let {name, age, id} = person;

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

* El nombre de la variable y el índice de objeto deben ser los mismos

Príncipe Ahmed
fuente
2
Eso es más largo que la pregunta del OP, porque es equivalente a let { a, b } = { a: 0, b: 0 }.
Dan Dascalescu
4

Específicamente a lo que ha pedido el OP, si desea inicializar N variables con el mismo valor (por ejemplo 0), puede usar la desestructuración de matriz y Array.fill para asignar a las variables una matriz de N 0s:

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

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

Dan Dascalescu
fuente
0

tenga en cuenta que solo puede hacer esto con números y cadenas

Podrías hacerlo...

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

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