你对此有何看法?
var x = {a: 1}; //=> {a: 1}
var y = Object.keys(x); //=> ['a']
x[y] //=> 1
如果y = ['a']
,x[y]
与执行x[['a']]
相同,对吧?
x[['a']]; //=> 1
x[[['a']]]; //=> 1
x[[[[[[[['a']]]]]]]]; //=> 1
有人能解释一下这里发生了什么吗?为什么这样做?
答案 0 :(得分:13)
属性名称必须是字符串。如果您尝试将数组用作属性名称,则会隐式调用其toString()
方法。这会生成一个包含逗号分隔的值列表的字符串。
> var array = ['a', 'b', 'c'];
undefined
> array.toString();
'a,b,c'
如果您只有一个值,那么就没有任何逗号。
> var array = ['a'];
undefined
> array.toString();
'a'
答案 1 :(得分:-3)
@Quentin建议属性名称自动转换为字符串。好吧,我认为他已经在那里做了一些事情,但给出两个明确的arr.toString()
示例并没有真正证明使用数组访问对象的属性。我提出这个作为他的帖子的编辑。然而,他把它翻了回来。
无论如何,这更明显地证明了隐式行为,imo。
var x = {'a,b,c': 1};
var y = ['a','b','c'];
x[y]; //=> 1
答案 2 :(得分:-6)
我认为它来自两个事实:
所以你的
["a"]
当用作键时,将被“转换”为字符串,这将给出
a
甚至
[[[[["a"]]]]].toString() == a // true
所以你的
x[y]
结束联合国
x["a"]