【发布时间】:2019-09-15 06:50:17
【问题描述】:
我遇到了一个场景,其中 JavaScript 的行为方式让我有些困惑。
假设我们有一个带有两个键 foo 和 bar 的对象。
a = { foo: 1, bar: 2 }
然后,我有一个字符串数组,在本例中是一个 'foo'
b = ['foo']
我希望得到以下结果:
a[b] == undefined
a[b[0]] == 1
但是,事情就是这样:
a[b] == 1
a[b[0]] == 1
为什么 JavaScript 在用作键时会转换 ['foo'] -> 'foo'?
有人知道原因吗?
如何预防?
let a = { foo: 1, bar: 2 }
let b = ['foo']
console.log(a[b] == 1) // expected a[b] to be undefined
console.log(a[b[0]] == 1) // expected a[b] to be 1
【问题讨论】:
-
这可以通过不使用数组作为键来防止。
-
防止这种情况的一种简单方法是使用
Map而不是对象。 -
仅仅是因为JavaScript在用作对象键时将每个对象转换为字符串?键始终必须是字符串(或符号)。
-
这不仅仅发生在单字符串数组中。唯一让它们与众不同的是它们的字符串转换会导致它们中包含的相同字符串。但是您也可以尝试使用
a[b] = 1和b = ['foo', 'bar']并得到a['foo,bar'] == 1。 -
有趣的事实,数组只是奇异的对象,所以以下都产生 1:
[1][0],[1]["0"]。使用对象时,所有键都转换为字符串。这是您可能希望使用Map将某物的真实值存储为键的原因之一
标签: javascript