var var1 = 1,
    var2 = 1,
    var3 = 1;

Esto es equivalente a esto:

var var1 = var2 = var3 = 1;

Estoy bastante seguro de que este es el orden en que se definen las variables: var3, var2, var1, lo que sería equivalente a esto:

var var3 = 1, var2 = var3, var1 = var2;

¿Hay alguna forma de confirmar esto en JavaScript? ¿Usa algún perfilador posiblemente?

184
David Calhoun 18 nov. 2009 a las 22:48

7 respuestas

La mejor respuesta

Realmente,

var var1 = 1, var2 = 1, var3 = 1;

Es no equivalente a:

var var1 = var2 = var3 = 1;

La diferencia está en el alcance:

function good() {
  var var1 = 1, var2 = 1, var3 = 1;
}

function bad() {
  var var1 = var2 = var3 = 1;
}

good();
console.log(window.var2); // undefined

bad();
console.log(window.var2); // 1. Aggh!

En realidad, esto muestra que la asignación es correcta asociativa. El ejemplo bad es equivalente a:

var var1 = (window.var2 = (window.var3 = 1));
397
Jonathan 30 ago. 2017 a las 09:44

Ahora está claro que no son lo mismo. La forma de codificar eso es

var var1, var2, var3
var1 = var2 = var3 = 1

Y, ¿qué hay de dejar asignación? Exactamente lo mismo que var, no permita que la asignación let lo confunda debido al alcance del bloque.

let var1 = var2 = 1 // here var2 belong to the global scope

Podríamos hacer lo siguiente:

let v1, v2, v3
v1 = v2 = v3 = 2

Nota: por cierto, no recomiendo usar múltiples asignaciones, ni siquiera múltiples declaraciones en la misma línea.

0
fenderOne 3 abr. 2019 a las 11:09
a = (b = 'string is truthy'); // b gets string; a gets b, which is a primitive (copy)
a = (b = { c: 'yes' }); // they point to the same object; a === b (not a copy)

(a && b) es lógicamente (a ? b : a) y se comporta como una multiplicación (por ejemplo, !!a * !!b)

(a || b) es lógicamente (a ? a : b) y se comporta como una suma (por ejemplo, !!a + !!b)

(a = 0, b) es la abreviatura de no importarle si a es verdadero, implícitamente devuelve b


a = (b = 0) && "nope, but a is 0 and b is 0"; // b is falsey + order of operations
a = (b = "b is this string") && "a gets this string"; // b is truthy + order of ops

Precedencia del operador de JavaScript (orden de operaciones)

Tenga en cuenta que el operador de coma es en realidad el operador menos privilegiado, pero los paréntesis son los más privilegiados, y van de la mano al construir expresiones de una línea.


Eventualmente, es posible que necesite 'thunks' en lugar de valores codificados, y para mí, un thunk es tanto la función como el valor resultante (la misma 'cosa').

const windowInnerHeight = () => 0.8 * window.innerHeight; // a thunk

windowInnerHeight(); // a thunk
8
neaumusic 9 dic. 2018 a las 01:05

La asignación en JavaScript funciona de derecha a izquierda. var var1 = var2 = var3 = 1;.

Si el valor de cualquiera de estas variables es 1 después de esta declaración, lógicamente debe haber comenzado desde la derecha; de lo contrario, el valor o var1 y var2 no estarían definidos.

Puede pensar que es equivalente a var var1 = (var2 = (var3 = 1)); donde se evalúa primero el conjunto de paréntesis más interno.

18
Antony 3 ene. 2018 a las 15:20

Prueba esto:

var var1=42;
var var2;

alert(var2 = var1); //show result of assignment expression is assigned value
alert(var2); // show assignment did occur.

Tenga en cuenta el único '=' en la primera alerta. Esto mostrará que el resultado de una expresión de asignación es el valor asignado, y la segunda alerta le mostrará que la asignación ocurrió.

Se deduce lógicamente que la asignación debe haberse encadenado de derecha a izquierda. Sin embargo, dado que todo esto es atómico para JavaScript (no hay subprocesos), un motor en particular puede optar por optimizarlo de manera un poco diferente.

4
Joel Coehoorn 18 nov. 2009 a las 20:15

coffee-script puede lograr esto con aplomo.

for x in [ 'a', 'b', 'c' ] then "#{x}" : true

[ { a: true }, { b: true }, { c: true } ]

-3
Alex Gray 15 oct. 2015 a las 04:43

var var1 = 1, var2 = 1, var3 = 1;

En este caso, la palabra clave var es aplicable a las tres variables.

var var1 = 1,
    var2 = 1,
    var3 = 1;

Que no es equivalente a esto:

var var1 = var2 = var3 = 1;

En este caso, detrás de las pantallas, la palabra clave var solo es aplicable a var1 debido a la elevación variable y el resto de la expresión se evalúa normalmente, por lo que las variables var2, var3 se están convirtiendo en globales

Javascript trata este código en este orden:

/*
var 1 is local to the particular scope because of var keyword
var2 and var3 will become globals because they've used without var keyword
*/

var var1;   //only variable declarations will be hoisted.

var1= var2= var3 = 1; 
8
Gangadhar JANNU 14 mar. 2016 a las 09:47