javascript - ecmascript 5 或 6 中未定义键和空键的行为

标签 javascript properties null undefined accessor

我很想知道在 javascript 中通过未定义键或空键访问对象时正确的行为是什么。

我检查了它在 Chrome 46、Firefox 42 和节点 0.12.0 中的行为,它们是一样的:

var obj = {};
obj[undefined] = 'foo';
obj[undefined]; // 'foo'
obj['undefined']; // 'foo'
obj; // {undefined: 'foo'}

或:

var obj = {};
obj[null] = 'foo';
obj[null]; // 'foo'
obj['null']; // 'foo'
obj; // {null: 'foo'}

然后,似乎 undefinednull 被强制转换为字符串 'undefined''null' .但是,如果我阅读 ecmascript specs我看到使用了 RequireObjectCoercible。读书RequireObjectCoercible specs ,我看到当它作为参数传递 undefined 或 null 时,它会抛出 TypeError 异常。

因此我不明白为什么我在检查时会重现另一个行为。


编辑:

感谢 Andreas 和 Bergi

我理解这种行为是因为:

12.3.2.1 Runtime Semantics: Evaluation

[...]

  1. Let propertyKey be ToPropertyKey(propertyNameValue).

7.1.14 ToPropertyKey ( argument )

[...]

  1. Return ToString(key).

7.1.12 ToString ( argument )

The abstract operation ToString converts argument to a value of type String according to Table 12:

[...]

Undefined | Return "undefined".

Null | Return "null".

对吧?

最佳答案

RequireObjectCoercible 是在构造属性引用之前在基值上调用的,而不是在属性上调用的。 obj 可强制转换为对象 :-) 当您执行 undefined.xnull[y] 之类的操作时,它确实会抛出。

关于javascript - ecmascript 5 或 6 中未定义键和空键的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34370284/

相关文章:

nhibernate - 如何在名为IQuery参数的NHibernate上设置C#可为空的值键入值?

php - 只更新不为空的字段

javascript - 如何使用 Chart.js 在标签中放置新行?

javascript - underscore/lodash - 组合具有相同元素的对象

objective-c - 只读属性如何工作

c#-4.0 - 如何在 C# 4.0 中创建静态类的属性

iphone - 自动释放和属性

sql - postgres json数组元素和空返回

javascript - 在幻灯片中使用 javascript 转换图片时,整个页面都会抖动

javascript - 如何检测浏览器的后退或前进按钮被按下?