此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.x
和window[x]
是等价的。这是不正确的。 window.x
相当于window["x"]
。
答案 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
属性将保留null
,window.bar
将生成undefined
:
alert( window.bar === undefined ); // false
alert( undefined === null ); // false
ECMAScript 3上的undefined
属性未被指定为{ ReadOnly }
,(以及他的朋友NaN
,Infinity
)。
这在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
的值,如果x
是bar
,如果window.bar = null
x
blub
,您将有效window.blub = null
{{1}}。
有关这方面的更多信息,请访问MDC:
https://developer.mozilla.org/en/JavaScript/Reference/Operators/Member_Operators