'undefined'变量用作具有'undefined'属性名称的对象的键

Jac*_*son 11 javascript

考虑以下...

var x = {};
x.undefined = "Hello World!";
var y;

//Prints "Hello World!"
console.log(x[y]);
Run Code Online (Sandbox Code Playgroud)

工作jsFiddle

为什么会这样?是因为这样,它返回一个字符串而不是实际的未定义?

Roc*_*mat 18

当你这样做时,x.undefined你设置了一个x被叫属性'undefined'.它与undefined(保留字变量writable:false)共享名称的事实是巧合.

后来,当你做,console.log(x[y])你正在寻找yx.对象的键是字符串,因此y转换为字符串.当undefined转换为字符串时,它变为'undefined'.这'Hello World!'就是返回的原因.

  • @JakeMorrison:是的,完全正确。它将 `y` 转换为字符串:-) (2认同)

Bar*_*mar 8

当使用表示法访问属性时.,属性名称不会被计算为表达式,而是一个文字字符串。

x.undefined
Run Code Online (Sandbox Code Playgroud)

相当于:

x['undefined']
Run Code Online (Sandbox Code Playgroud)

要设置键为 的属性undefined,您必须编写:

x[undefined] = "Bye, cruel world";
Run Code Online (Sandbox Code Playgroud)

有趣的是,Chrome 允许我这样做。

  • 在最后一种情况下,键“undefined”被强制为“undefined”,因为[ECMAScript属性访问](http://www.ecma-international.org/ecma-262/5.1/#sec-11.2.1 )(参见步骤 6)使用 [`ToString`](http://www.ecma-international.org/ecma-262/5.1/#sec-9.8) 将密钥强制转换为字符串,并且 `ToString(undefined) = >“未定义”`。 (9认同)