2010-03-28 9 views
7

Je fais quelques expériences avec cette ligne JavaScript malveillant: var undefined = true;var undefined = true;

Chaque variable non initialisée en JavaScript a la valeur de undefined qui est juste une variable qui contient la valeur spéciale de 'undefined', de sorte que le suivant doit exécuter le alert:

var undefined = true, 
    x; 

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

Mais ce n'est pas le cas, et ma question est pourquoi?

sur l'expérimentation plus loin, j'essayé ce qui suit:

var undefined = true, 
    x = undefined; 

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

Cette fois, le alert est exécuté.

Donc ma question est ... puisque dans le premier extrait x détient undefined (parce qu'il n'est pas initialisé), pourquoi n'a pas exécuté le alert? La chose étrange est que lorsque l'on affirme explicitement que x est undefined (x = undefined), le alert exécuté ...

Répondre

17

Il existe une différence entre une variable nommée undefined et la valeur undefined.

var undefined = true, 
    x; 

Dans cet exemple, la variable undefined est définie sur la valeur true et x à la valeur (pas la variable!) undefined.

var undefined = true, 
    x = undefined; 

Dans cet exemple, la variable undefined est réglé sur la valeur true aussi bien, et x est réglé sur la valeur contenue dans la variable undefined (qui est true). Par conséquent, bien que vous puissiez déclarer une variable nommée undefined, vous ne pouvez pas modifier le fait que les variables non initialisées sont définies sur undefined.

+0

Hehe; que se passerait-il si la variable 'undefined' était la valeur' undefined'? – Pindatjuh

+3

@Pindatjuh: le même que si la variable avait un autre nom. Il n'y a rien de spécial à propos d'une variable nommée 'undefined'. – dtb

1

juste déclarer une variable appelée « non défini » ne signifie pas que vous surchargeons le concept intégré de ce que le La valeur "indéfinie" native est. Imaginez si Java vous permet d'utiliser "null" comme identificateur. Eh bien, je suppose que Java n'a pas la même contrainte que Javascript. Quoi qu'il en soit la déclaration Javascript

if (x) alert("foo"); 

implique une contrainte implicite de la valeur de « x » à booléens. La valeur n'est pas définie, donc sa coercition à "booléen" aboutit à false.

+0

@Andreas Grech - Bizarrement, '" \ n \ t "== true' est aussi en réalité' false'. – JulianR

+0

En fait, le concept de vrai en JavaScript est chaque valeur sauf null, indéfini, la chaîne vide '', 'NaN', '0' et' false' –

0

Les variables non initialisées ont la valeur spéciale undefined. Lorsque vous affectez une variable à une autre variable, vous lui attribuez une chaîne qui référence une variable que vous avez définie dans la portée actuelle. Dans ce cas, vous avez défini une variable nommée undefined afin que le moteur JavaScript examine d'abord les variables, voir que vous en avez nommé un undefined, puis lui affecter cette variable.