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
Para lograr esto, debe dividir la declaración var
de la asignación encadenada (ver: http://davidshariff.com/blog/chaining-variable-assignments-in-javascript-words-of-caution/ ).
P.ej
var one = 1, two = 2;
one = two = 3; /* Now both equal 3 */
Pero si haces lo que describes ( var one = two = 3;
en este ejemplo), two
filtran en el espacio global, mientras que one
se declara en el ámbito local.
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 []