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 ...


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 = [];

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


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;

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.


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


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


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;
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.