为什么使用数组作为键访问对象中的元素是有效的?

Why does accessing an element in an object using an array as a key work?

本文关键字:元素 有效 对象 访问 数组 为什么      更新时间:2023-09-26

你怎么看?

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
谁能解释一下这里发生了什么?为什么会这样呢?

属性名必须是字符串。如果您尝试使用数组作为属性名,则会隐式地调用它的toString()方法。生成一个字符串,其中包含以逗号分隔的值列表。

> var array = ['a', 'b', 'c'];
undefined
> array.toString();
'a,b,c'

如果你只有一个值,那么没有逗号。

> var array = ['a'];
undefined
> array.toString();
'a'

@Quentin建议将属性名自动转换为字符串。好吧,我认为他是对的东西,但给出两个显式的arr.toString()的例子并没有真正演示访问一个对象的属性使用数组。我把这个作为他帖子的编辑。然而,他把它滚回来了。

无论如何,在我看来,这更明显地展示了隐含的行为。

var x = {'a,b,c': 1};
var y = ['a','b','c'];
x[y]; //=> 1

我认为这有两个原因:

  1. JS引擎类型
  2. 任何JS对象都可以像数组一样被访问

所以你的

["a"] 

当用作键时将被"强制转换"为string,这将给出

a
甚至

[[[[["a"]]]]].toString() == a // true

所以你的

x[y] 

end UN as

x["a"]