猿问

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

好奇以下两种情况:


第一的:


const key = 2;

const obj = { "2": "stackoverflow" };

obj[key]; //results in "stackoverflow" but the key is 2 and not "2"

第二:


//Vice versa case

const otherKey = "21";

const otherObj = { 21: "youtube" };

otherObj[otherKey]; //results in "youtube" but the key is "21" and not 21

我的结论:


由于键应该是字符串,并且key在 Javascript 对象中查找(当键似乎是数字时)存在时,它通过类型转换比较而不是通过严格或字符串转换来实现。


这些案例是否有效,而且我对其中的部分更感兴趣?


长风秋雁
浏览 197回答 3
3回答

阿波罗的战车

该标准的相关位是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 中描述并且完全相同。

MMTTMM

这里发生的是一种称为类型强制的东西,其中一种类型的值被转换为另一种类型,以便使用所述值执行某些操作。由于 Javascript 中的对象存储键和值,并且键存储为字符串,因此当您提供数值作为对象的键时,它会被强制转换为字符串,然后在对象中查找。如果我们以数组为例会更清楚一些。数组在索引处存储值,索引是数字。因此,如果我们有var a = [4, 3, 5],在索引中查找值2使用a[2],并a["2"]会给你同样的结果5,因为该字符串"2"被强制转换为number类型以支持数组中的查找操作。希望有帮助。

肥皂起泡泡

从这里的MDN 文档属性名称必须是字符串。这意味着非字符串对象不能用作对象中的键。任何非字符串对象,包括数字,都通过 toString 方法被类型转换为字符串。所以,基本上键被类型强制转换为字符串,即使它们是数字。const object = { 21 : 'test', '21': 'message' };console.log(object)
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答