JavaScript:使用点符号与括号表示法时的不同行为

时间:2010-11-20 20:11:51

标签: javascript

此JavaScript代码段

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

警告“真实”。

但是,这个片段

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

警告“错误”。

这里发生了什么?

(我在HTML页面内的最新Chrome浏览器中运行此代码,其中没有其他JavaScript代码。)

更新

正如@elusive在下面的评论中巧妙地总结的那样,我错误地认为window.xwindow[x]是等价的。这是不正确的。 window.x相当于window["x"]

2 个答案:

答案 0 :(得分:3)

您遇到的行为是因为Global对象的undefined属性在任何基于 ECMAScript 3 的实现上都是可变的。 (最新的Chrome版本正在实施ES5,但这种行为仍然存在)。

让我们来看看第二个片段:

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

x变量将保留undefined值,因为foo属性不存在。

通过分配window[x] = null,您将覆盖undefined属性的值:

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

(在您的第一个代码段中,当您指定window.x = null时,您正在"x"对象上创建名为window的属性。)

因此(在您的第二个代码段中),undefined属性将保留nullwindow.bar将生成undefined

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

ECMAScript 3上的undefined属性未被指定为{ ReadOnly },(以及他的朋友NaNInfinity)。

这在ECMAScript 5中已经改变,这些属性被描述为不可写入。

答案 1 :(得分: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

您可以直接将属性x设置为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

在这里,您将在窗口对象上将其用作key来设置属性。那是什么关键?这取决于x的值,如果xbar,如果window.bar = null x blub,您将有效window.blub = null {{1}}。

有关这方面的更多信息,请访问MDC:
https://developer.mozilla.org/en/JavaScript/Reference/Operators/Member_Operators