当用作对象键时,JavaScript为什么将一个字符串的数组转换为字符串?

tom*_*pos 23 javascript

我遇到了JavaScript表现有些令人困惑的情况。

假设我们有一个带有两个键foo和bar的对象。

a = { foo: 1, bar: 2 }
Run Code Online (Sandbox Code Playgroud)

然后,我有一个字符串数组,在这种情况下是一个'foo'

b = ['foo']
Run Code Online (Sandbox Code Playgroud)

我期望以下几点:

a[b] == undefined
a[b[0]] == 1
Run Code Online (Sandbox Code Playgroud)

但是,这是发生了什么:

a[b] == 1
a[b[0]] == 1
Run Code Online (Sandbox Code Playgroud)

为什么将JavaScript ['foo'] -> 'foo'用作键时会进行转换?

外面有人知道原因吗?

如何预防?

Cod*_*iac 14

所有对象键都是字符串,因此最终会将您放置在其中的所有内容都转换[] (Bracket notation)为字符串,如果它是一个表达式,它将计算该表达式并将其值转换为字符串并用作键

console.log(['foo'].toString())
Run Code Online (Sandbox Code Playgroud)


看看这个例子来理解,这里[a]最终使用转换了toString a.toString(),然后将其设置为b对象的键

let a = { a : 1}

let b = {
  [a] : a
}

// object converted to string
console.log(a.toString())

// object built using [] computed property access
console.log(b)
Run Code Online (Sandbox Code Playgroud)


我该如何阻止

在实际情况下,您永远不要这样做,而只是为了说明,您可以拦截或覆盖toString对象的方法,并使用[]周围的字符串返回值:

let a = { foo: 1, bar: 2 }

let b = ['foo']
b.toString = function() {
  let string = this.join(',')
  return "[" + string  + "]"
}

console.log(b.toString())
console.log(a[b])
Run Code Online (Sandbox Code Playgroud)


Sin*_*dro 13

当使用数组作为键时,javascript会调用该数组的“ toString()”方法,然后尝试找到该数组的字符串化版本作为键。如果您调用['foo'].toString()该方法,则返回"foo"