2010-03-28 14 views
7

que estoy haciendo un poco de experimentación con esta línea de JavaScript malicioso: var undefined = true;var undefined = true;

Cada variable no inicializada en JavaScript tiene el valor de undefined que es sólo una variable que contiene el valor especial de 'undefined', por lo que el siguiente debe ejecutar el alert:

var undefined = true, 
    x; 

if (x) { 
    alert('ok'); 
} 

Pero no es así, y mi pregunta es ¿por qué?

En la experimentación, he intentado lo siguiente:

var undefined = true, 
    x = undefined; 

if (x) { 
    alert('ok'); 
} 

Esta vez, se ejecuta la alert.

Así que mi pregunta es ... ya que en el primer fragmento x contiene undefined (porque no está inicializado), ¿por qué no se ejecutó el alert? Lo extraño es que cuando afirma explícitamente que es xundefined (x = undefined), el alert ejecutados ...

Respuesta

17

hay una diferencia entre una variable llamada undefined y el valor denominado undefined.

var undefined = true, 
    x; 

En este ejemplo, la variable undefined se establece en el valor true y x al valor (no la variable!) undefined.

var undefined = true, 
    x = undefined; 

En este ejemplo, la variable de undefined se establece en el valor true también, y x se establece en el valor contenido en la variable undefined (que es true).

Así, mientras que se puede declarar una variable llamada undefined, no se puede cambiar el hecho de que las variables no inicializado se establecen en el valor undefined.

+0

Hehe; ¿Qué pasaría si la variable 'undefined' fuera el valor' undefined'? – Pindatjuh

+3

@Pindatjuh: lo mismo que si la variable tuviera otro nombre. No hay nada especial acerca de una variable llamada 'undefined'. – dtb

1

Sólo se declara una variable llamada "indefinido", no significa que usted está anulando la incorporada en el concepto de lo que el el valor nativo "indefinido" es

Imagínese si Java le permitiría utilizar "nulo" como identificador. Bueno, supongo que Java no tiene la misma coerción que Javascript. De todos modos la declaración Javascript

if (x) alert("foo"); 

implica una coerción implícita del valor de "x" a booleano. El valor no está definido, por lo que su coerción para "boolean" da como resultado false.

+0

@Andreas Grech - Curiosamente, ' "\ n \ t" == true' también es en realidad' false'. – JulianR

+0

En realidad, el concepto de verdadero en JavaScript es cada valor excepto nulo, indefinido, la cadena vacía '', 'NaN',' 0' y 'false' –

0

variables sin inicializar obtener el valor especial undefined. Cuando asigna una variable a otra, le da una cadena que hace referencia a una variable que ha definido dentro del alcance actual. En este caso se ha definido una variable llamada undefined por lo que el motor de JavaScript buscará primero a través de las variables, se ve que ha sido nombrado como uno undefined y luego asigna esa variable.