2011-09-22 16 views
23

Busqué a través de las redes pero no pude encontrar un criterio de búsqueda relevante, así que pensé que este sería el mejor lugar para preguntar.Javascript a = b = declaraciones C

que tiene declaración diciendo JS

document.location.hash = this.slug = this.sliceHashFromHref(href) 

¿Cómo funciona esto ??

+2

¿Qué quiere decir "¿cómo funciona esto?" – Jamiec

+3

Consulte [Asignación de múltiples personas a la izquierda con JavaScript] (http://stackoverflow.com/questions/1758576/multiple-left-hand-assignment-with-javascript). –

+1

@Jamiec: Funciona muy bien, gracias por preguntar;) – Piskvor

Respuesta

3

Se evalúa de derecha a izquierda. es decir

document.location.hash = this.slug = this.sliceHashFromHref(href) 

de salida/valor de

this.sliceHashFromHref(href) 

se les asigna a document.location.hash = this.slug

+1

No quiero ofenderme por esto, pero siento que la respuesta de @aioobe debería aceptarse, ya que ha sido votado mejor por la comunidad, es más extenso y (en mi opinión) lo explica mejor. Lo siento si esto se toma de la manera incorrecta. –

46

¿Cómo funciona esto?

a = b puede ser visto como una declaración tanto y un expresión.

El resultado de la expresión es b.

En otras palabras,

a = b = c; 

que puede escribirse como

a = (b = c); 

es equivalente a

b = c; 
a = b; 

lo tanto su código es equivalente a:

this.slug = this.sliceHashFromHref(href); 
document.location.hash = this.slug; 
+0

Si el resultado de la expresión 'a = b' es' b', entonces la expresión 'a = (b = c)' debe ser equivalente a 'b = do; a = c; '(pero esto no significa que' a = b = foo() 'llamará' foo' dos veces!). Me pregunto cómo funcionará 'a = b = c' en caso de que' a', 'b' y' c' tengan getters y setters. El getter de 'c' se llamará una vez y luego se llamará al setter de' b' - ¿se llamará al getter de 'b' para obtener el valor del setter de' a'? – Oren

5

Muy fácil ... Se asigna el resultado de la llamada a this.sliceHashFromHref(href) tanto document.location.hash y this.slug, por lo ambas propiedades (variables) contienen el mismo valor después de que se haya ejecutado la línea.

4

En Javascript (y en varios otros idiomas que derivan su sintaxis de C) una tarea evalúa el elemento a la derecha del símbolo = y lo asigna a la variable de la izquierda. El elemento de la derecha puede ser una tarea con un operador =. Lo que sucede es que se evalúa la expresión más a la derecha, el valor asignado a la variable del medio, y luego ese valor se asigna a la variable de la izquierda.

En resumen, es simplemente una manera de asignar un valor a múltiples variables a la vez.

8

¡Tenga en cuenta el alcance de las variables!

var A = B = C = 3; //A is local variable while B & C are global variables; 
var A = 3 , B = 3, C = 3;// A B C are local variables; 
+0

esto es muy importante, pero la mayoría de las respuestas simplemente los ignoraron ... – Martian2049

-1

En realidad, la respuesta de Ma Jerez hace un punto muy importante aquí.También esta respuesta se refiere a esto similar question: esta pregunta implica un par de cosas:

  1. elevador: se izan las variables antes de la ejecución de código de bloque;
  2. = orden de asignación: va de derecha a izquierda;
  3. contexto global: en modo no estricto, cuando una variable no está definida, va al contexto global; pero lanzará en modo 'uso estricto';

example1:

;(function Anonymous(){ 
    var a = b = {}; 
    console.log(a==b); //true 
})(); 
  1. a fue izada en el ámbito Anonymous ejecución.

  2. b va a ser asignado como {}, sino porque b no está definido, b se asigna al contexto global window, a continuación, se asigna window.b{}; luego window.b = {}return s {}.

  3. variable local a se asigna como {}.

Por lo tanto, algunas cosas interesantes suceden aquí: la local variable a y la global variable b ambos apuntan al mismo objeto {}, por lo que son == y ===; recuerde que {}=={} da false si no.

Nota: si está en modo estricto:

;(function Anonymous(){ 
    'use strict' 
    var a = b = {}; //Uncaught ReferenceError: b is not defined 
})(); 

esta asignación consecutiva no funcionará de la misma manera ...

Cuestiones relacionadas