3 回答
![?](http://img1.sycdn.imooc.com/5333a1660001394602000200-100-100.jpg)
TA贡献1862条经验 获得超6个赞
该标准的相关位是
12.3.2.1 运行时语义:评估
MemberExpression:MemberExpression[表达式]
...6. 让 propertyKey 是?ToPropertyKey(propertyNameValue)。
和
7.1.14 ToPropertyKey(参数)
让关键是?ToPrimitive(参数,提示字符串)。
如果 Type(key) 是 Symbol,则返回键。
返回 !ToString(键)。
用简单的英语,在object[whatever],whatever被转换为字符串,除非它是一个symbol。
插图:
let s = Symbol();
let o = {
'12': 1,
'foo': 2,
'true': 3,
[s]: 4
}
console.log(o[6*2])
console.log(o[{toString: () => 'foo'}])
console.log(o[1 === 1])
console.log(o[s])
对象初始值设定项的行为在12.2.6.7 中描述并且完全相同。
![?](http://img1.sycdn.imooc.com/5458626a0001503602200220-100-100.jpg)
TA贡献1829条经验 获得超6个赞
从这里的MDN 文档
属性名称必须是字符串。这意味着非字符串对象不能用作对象中的键。任何非字符串对象,包括数字,都通过 toString 方法被类型转换为字符串。
所以,基本上键被类型强制转换为字符串,即使它们是数字。
const object = { 21 : 'test', '21': 'message' };
console.log(object)
添加回答
举报