为了账号安全,请及时绑定邮箱和手机立即绑定

为什么作为键的数字对对象中的字符串键起作用,反之亦然

为什么作为键的数字对对象中的字符串键起作用,反之亦然

长风秋雁 2021-11-18 20:01:04
好奇以下两种情况:第一的:const key = 2;const obj = { "2": "stackoverflow" };obj[key]; //results in "stackoverflow" but the key is 2 and not "2"第二://Vice versa caseconst otherKey = "21";const otherObj = { 21: "youtube" };otherObj[otherKey]; //results in "youtube" but the key is "21" and not 21我的结论:由于键应该是字符串,并且key在 Javascript 对象中查找(当键似乎是数字时)存在时,它通过类型转换比较而不是通过严格或字符串转换来实现。这些案例是否有效,而且我对其中的部分更感兴趣?
查看完整描述

3 回答

?
阿波罗的战车

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 中描述并且完全相同。


查看完整回答
反对 回复 2021-11-18
?
MMTTMM

TA贡献1869条经验 获得超4个赞

这里发生的是一种称为类型强制的东西,其中一种类型的值被转换为另一种类型,以便使用所述值执行某些操作。

由于 Javascript 中的对象存储键和值,并且键存储为字符串,因此当您提供数值作为对象的键时,它会被强制转换为字符串,然后在对象中查找。

如果我们以数组为例会更清楚一些。数组在索引处存储值,索引是数字。因此,如果我们有var a = [4, 3, 5],在索引中查找值2使用a[2],并a["2"]会给你同样的结果5,因为该字符串"2"被强制转换为number类型以支持数组中的查找操作。

希望有帮助。


查看完整回答
反对 回复 2021-11-18
?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

从这里的MDN 文档


属性名称必须是字符串。这意味着非字符串对象不能用作对象中的键。任何非字符串对象,包括数字,都通过 toString 方法被类型转换为字符串。


所以,基本上键被类型强制转换为字符串,即使它们是数字。


const object = { 21 : 'test', '21': 'message' };


console.log(object)


查看完整回答
反对 回复 2021-11-18
  • 3 回答
  • 0 关注
  • 196 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信