update support es6 array javascript object variable-assignment

support - En JavaScript, ¿la asignación encadenada está bien?



object destructuring javascript (6)

Con el primer ejemplo, b es una referencia a a , y b convierte en una variable global, accesible desde cualquier lugar (y reemplaza cualquier variable b que ya exista en el ámbito global).

No soy nuevo en JS o su sintaxis, pero a veces, la semántica del lenguaje me ha dejado perplejo a veces. En el trabajo de hoy, un colega mencionó esto:

var a = b = [];

no es lo mismo que

var a = [], b = [];

o

var a = []; var b = [];

ya que la primera versión realmente asigna la referencia a una matriz vacía a a y b. No podía aceptar esto como cierto, pero no estoy seguro. ¿Qué piensan todos ustedes?


Para complementar las respuestas ya proporcionadas. Las asignaciones de ref son diferentes de las asignaciones de valores

var x = y = 3; // by value y++; // 4 x; // 3 var a = b = []; // by ref b.push(1); // [1]; a; // [1] a; = []; a.push(2); // [2]; b; // [1]

Ahora que hemos abordado 2 dos, su pregunta también hace referencia a la pelusa, que es la práctica del "código bonito" (no funcional). De hecho, JSHint ha desaprobado todas sus "reglas de código bonitas"

Dicho esto, usualmente uso el siguiente estilo.-

var a, b, c, // first row all unassigned x = 1, // 1 row per assigned y = 2, list = [ ''additional'', ''indentation'' ], obj = { A: ''A'', B: ''B'' }; var z = y +2; // created a new `var` cluster since it uses a var from the previous



Sí, no son lo mismo. var a = b = [] es equivalente a

var a; b = []; a = b;

No solo se le asigna a a y b el mismo valor (una referencia a la misma matriz vacía), b no se declara en absoluto. En modo estricto en ECMAScript 5 y posterior, esto generará un error de ReferenceError ; de lo contrario, a menos que ya exista una variable b en el alcance, b se crea silenciosamente como una propiedad del objeto global y actúa de forma similar a una variable global, independientemente de dónde esté el código, incluso dentro de una función. Lo cual no es bueno

Puedes ver esto bastante fácilmente:

(function() { var a = b = []; })(); window.console.log(b); // Shows []


Tu colega tiene razón. La primera declaración crea una nueva matriz vacía. Luego, se asigna una referencia a esta matriz a b. Luego, la misma referencia (que es el resultado de la expresión de asignación) se asigna a a. Entonces a y b se refieren a la misma matriz.

En todos los demás casos, crea dos matrices individuales.

Por cierto: este comportamiento es bastante común y es el mismo en todos los lenguajes de programación basados ​​en C. Entonces esto no es específico de JavaScript.


Tu colega tiene razón:

var a = b = []; a.push(''something''); console.log(b); // outputs ["something"]

pero:

var a = [], b = []; a.push(''something''); console.log(b); // outputs []