访问JSON对象中的数组元素

时间:2015-04-10 04:17:24

标签: javascript arrays json object

无意中,在我的项目中,我使用了以下代码,我很惊讶地看到它正在运行:

HTML

<span id="output"></span>

的Javascript

var myObject = {
  'a': '----First---',
  'b': '----Second---',
  'c': '----Third----'
};

var myArray = ['a'];

// First Case
output.innerHTML = myObject[myArray];

var myArray2 = ['b'];

// Second Case
output.innerHTML += myObject[myArray2];

var myArray3 = ['a', 'b'];

// Third Case 
output.innerHTML += myObject[myArray3];

输出

----First-------Second---undefined

Jsbin Link:http://jsbin.com/godilosifu/1/edit?html,js,output

我直接访问Object中的数组引用,在所有情况下都应该是未定义的,但奇怪的是当数组大小为1时,它总是获取第一个元素并将其用作对象键。

我只是想知道这个概念叫什么,为什么会这样?

3 个答案:

答案 0 :(得分:7)

因为属性名称必须是字符串,所以使用toString()方法将其类型转换为一个字符串。您的第三个示例未定义的原因是['a', 'b'].toString()等于'a,b',这不是您对象中的属性。

  

媒体资源名称

     

属性名称必须是字符串。这意味着非字符串对象   不能用作对象中的键。任何非字符串对象,包括   一个数字,通过toString方法被转换为字符串。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Property_Accessors

值得注意的是,在ECMAScript 6中,有一个名为Map的新集合类型,它允许您将任何对象用作没有类型强制的密钥。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map

答案 1 :(得分:3)

当您将数组作为Key传递给对象时,它会在其上调用toString()。这是因为Javascript中的所有键都是字符串。

['a'].toString() is "a"
myObject['a'] is "----First----"

请参阅:Keys in Javascript objects can only be strings?

答案 2 :(得分:2)

这是自动投射。在Javascript中,只有字符串可以索引到对象的属性中。 myObject不是数组,而是一个对象。即使您使用括号来访问它的属性,它也与数组对象上使用的括号不同。

由于只允许通过字符串命名对象属性,编译器会自动将数组转换为字符串(本质上调用它的本机toString()函数,对于数组,它使用逗号连接所有元素)。

因此,当您将数组传递给对象的属性访问器/索引时,它会执行以下操作:

myArray1 ==> "a";
myArray2 ==> "b";
myArray3 ==> "a" + "," + "b" ===> "a,b";