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?
javascript
variables
variable-assignment
David Calhoun
fuente
fuente
this.var1 = this.var2 = this.var3 = 1
?Respuestas:
Realmente,
no es equivalente a:
La diferencia está en el alcance:
En realidad, esto muestra que la asignación es correcta asociativa. El
bad
ejemplo es equivalente a:fuente
var var1=var2
sucede despuésvar3 = 1
y despuésvar2 = var3
. es comovar3=1; var2=var3; var var1=var2
var v1, v2, v3;
Luego, más adelante:v1 = v2 = v3 = 6;
todavía estarán en el ámbito local. Desde que David mencionó las alertas, esto funcionaría como se esperaba (si se ha modificado previamente):alert(v1 = v2 = v3 = 6);
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, entonces lógicamente debe haber comenzado desde la derecha, si el valor ovar1
yvar2
sería indefinido.Puede pensarlo como equivalente a
var var1 = (var2 = (var3 = 1));
donde se evalúa primero el conjunto de paréntesis más interno.fuente
(
inmediatamente despuésvar
. Extracción del conjunto exterior de paréntesis permite que se compila sin error,var var1 = (var2 = (var3 = 1));
. En ese momento sentí que no ilustraba el punto tan bien, pero supongo que es lo mismo.var var1 = var2 = var3 = 1;.
igual avar var3 = 1; var var2 = var3; var var1 = var2;
En este caso, la
var
palabra clave es aplicable a las tres variables.que no es equivalente a esto:
En este caso, la
var
palabra clave detrás de las pantallas solo es aplicablevar1
debido a la elevación variable y el resto de la expresión se evalúa normalmente para que las variablesvar2, var3
se vuelvan globalesJavascript trata este código en este orden:
fuente
(a && b)
es lógicamente(a ? b : a)
y se comporta como una multiplicación (p. ej.!!a * !!b
)(a || b)
es lógicamente(a ? a : b)
y se comporta como una suma (p. ej.!!a + !!b
)(a = 0, b)
es corto para no preocuparse sia
es verdad, implícitamente regresab
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').
fuente
Prueba esto:
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 el JavaScript (no hay subprocesos), un motor en particular puede optar por optimizarlo de manera un poco diferente.
fuente
Ahora está claro que no son lo mismo. La forma de codificar eso es
Y, ¿qué pasa con dejar asignación? Exactamente lo mismo que var, no permita que la asignación let lo confunda debido al alcance del bloque.
Podríamos hacer lo siguiente:
Nota: por cierto, no recomiendo usar múltiples asignaciones, ni siquiera múltiples declaraciones en la misma línea.
fuente
coffee-script
puede lograr esto con aplomo.fuente