为什么使用数组作为关键工作来访问对象中的元素?

时间:2015-05-28 08:43:52

标签: javascript

你对此有何看法?

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

有人能解释一下这里发生了什么吗?为什么这样做?

3 个答案:

答案 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)

我认为它来自两个事实:

  1. JS引擎类型
  2. 任何JS对象都可以“访问”数组
  3. 所以你的

    ["a"] 
    
    当用作键时,

    将被“转换”为字符串,这将给出

    a
    

    甚至

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

    所以你的

    x[y] 
    

    结束联合国

    x["a"]