我遇到了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'用作键时会进行转换?
外面有人知道原因吗?
如何预防?
a = { foo: 1, bar: 2 }
Run Code Online (Sandbox Code Playgroud)
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"。