参见英文答案 >
Why does accessing an element in an object using an array as a key work?3个
为什么javascript将以下内容评估为true,因为对象foo具有有效的属性栏?
为什么javascript将以下内容评估为true,因为对象foo具有有效的属性栏?
foo[[[["bar"]]]] === foo["bar"]
基于运算符优先级,我认为foo [[[[“bar”]]]]试图以数组[[[“bar”]]]作为键来访问属性,但为什么它仍然“平坦化” “就像foo [”bar“]一样?
我的同事们说javascript解析器有简化括号,忽略了额外的括号.我不认为这是真的,因为将[[[“foo”]]]保存到变量测试会得到相同的结果:
> test = [[["bar"]]] [Array[1]] > foo["bar"] = 5 5 > foo[test] 5
语言或解析器的哪个方面导致了这种行为?谢谢!
解决方法
JavaScript括号表示法接受表达式,但它始终将该表达式的值转换为字符串.因此,如果传入数组,它将尝试将其转换为字符串.在你的情况下,你传入一个数组[[[“bar”]]]和[[[“bar”]]].toString()===“bar”.
如果你想知道为什么[[[“bar”]]].toString()===“bar”,那是因为当数组arr被隐式转换为字符串时,就像调用arr.join(‘,’) .也就是说,它的每个元素都被转换为字符串,然后以逗号分隔的字符串连接.当数组只有一个元素时,数组的字符串表示只是该元素的字符串表示.在您的情况下,您的数组([[[“bar”]]])有一个元素:[[“bar”]].
该数组也被转换为字符串,因为它也是一个单元素数组,它的字符串表示形式是该单个元素的字符串表示形式:[“bar”].
[“bar”]也是一个带有一个元素的数组,它是一个字符串,因此[“bar”]的字符串表示只是“bar”.
这归结为:[[[“bar”]]].toString()===“bar”
和foo [[[[“bar”]]]]与foo [[[[“bar”]]].toString()]相同.
您还会发现:
foo[[[[1]],[2]]] === foo["1,2"]
因为:[[[1]],[2]].toString()===“1,2”.