2010-11-20 6 views
4

Cet extrait de code JavaScriptJavaScript: comportement différent lorsque vous utilisez la notation de points par rapport à la notation support

var x = window.foo; 
window.x = null; 
alert(window.bar === undefined); 

alertes "true".

Cependant, cet extrait

var x = window.foo; 
window[x] = null; 
alert(window.bar === undefined); 

alertes "false".

Que se passe-t-il ici?

(je suis en cours d'exécution de ce code dans le dernier navigateur Chrome dans une page HTML sans autre code JavaScript il.)

Mise à jour

Comme @elusive habilement résumée dans son commentaire ci-dessous, j'ai supposé que window.x et window[x] sont équivalents. Ce n'est pas correct. window.x est équivalent à window["x"].

+0

Pouvons-nous demander quel est le contenu de 'window.foo'? –

+4

'window.x' est équivalent à' window ['x'] 'not' window [x] '. – jwueller

+0

@elusive Oui, vous l'avez résumé en une phrase :) –

Répondre

3

Le comportement que vous rencontrez est parce que la propriété undefined de l'objet global, est mutable sur toute implémentation basée sur ECMAScript 3. (les dernières versions de Chrome implémentent ES5, mais ce comportement est toujours présent).

Examinons le second extrait:

var x = window.foo; 
window[x] = null; 
alert(window.bar === undefined); 

La variable x tiendra la valeur undefined, puisque la propriété foo n'existe pas.

En attribuant window[x] = null, vous êtes Redéfinition de la valeur de la propriété undefined:

window[x] = null; // is equivalent to 
window['undefined'] = null; // or 
window.undefined = null; // 

(Dans votre premier extrait, lorsque vous attribuez window.x = null, vous créez une propriété nommée "x" sur l'objet window.)

Par conséquent (dans votre deuxième extrait), la propriété undefined tiendra null et window.bar produira undefined:

alert(window.bar === undefined); // false 
alert(undefined === null); // false 

La propriété undefined n'a pas été spécifié comme { ReadOnly } sur ECMAScript 3, (en même temps avec ses amis NaN, Infinity).

Cela a changé dans ECMAScript 5, ces propriétés sont décrites comme non-inscriptibles.

+0

@CMS La propriété globale 'undefined' n'est-elle pas modifiable sur un navigateur, pas seulement Chrome? –

+0

@ Šime, il * devrait * être mutable sur toute * implémentation basée sur ES3 *. A partir des dernières versions de navigateur que j'ai testées (Firefox, WebKit, IE9, Chrome), Chrome est le seul qui a encore undefined en écriture, même sur Chrome 9.0.583.0. – CMS

+0

@CMS Ce ne sont pas les résultats que je reçois. Les dernières versions de Chrome, Firefox et Opera me permettent de changer la valeur de la propriété globale 'undefined'. Seuls IE9 beta et Safari ne le permettent pas. –

1
var x = window.foo; // set the local variable x to the contents of window.foo 
window.x = null; // set property x on window to null 

Ici, vous définissez directement la propriété x sur null.

var x = window.foo; // set the local variable x to the contents of window.foo 
window[x] = null; // set they key with the value of x to null 

Ici vous définissez une propriété en utilisant comme un key sur l'objet de la fenêtre. Quelle est la clé? Eh bien cela dépend de la valeur de x, si x est bar vous ferez effectivement window.bar = null si x est blub vous ferez window.blub = null.

Pour plus d'informations sur ce que vous devez diriger vers MDC:
https://developer.mozilla.org/en/JavaScript/Reference/Operators/Member_Operators

+2

En fait, il s'agit d'un code global, donc x est une variable globale. –

+0

La réponse est la même. window.x définit la propriété nommée 'x'. window [x] définit la propriété nommée 'value-of-global-variable-x'. – GolezTrol

Questions connexes