访问JSON对象中的数组元素

3

在我的项目中,我无意中使用了以下代码,但惊讶地发现它可以正常工作:

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链接:http://jsbin.com/godilosifu/1/edit?html,js,output

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

我想知道这个概念叫什么,为什么会发生这种情况?

3个回答

7
由于属性名必须是字符串,因此会使用 toString() 方法将其强制转换为字符串。你的第三个示例未定义的原因是 ['a', 'b'].toString() 等于 'a,b',该值不是你对象中的属性名称。

属性名称

属性名称必须是字符串。这意味着非字符串对象不能用作对象中的键。任何非字符串对象(包括数字)都会通过 toString 方法强制转换为字符串。

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Property_Accessors

值得注意的是,在 ECMAScript 6 中,有一种新的集合类型叫做 Map,它允许您使用任何对象作为键而无需进行类型转换。

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Map


3
当你将数组传递给对象用作键时,它会调用toString()方法。这是因为Javascript中所有的键都是字符串类型。
['a'].toString() is "a"
myObject['a'] is "----First----"

请看:Javascript对象中的键只能是字符串吗?

2
这是自动转换的过程。在Javascript中,只有字符串可以作为对象属性的索引。`myObject`不是一个数组,而是一个对象。即使你使用方括号来访问它的属性,它的意义也与用于数组对象的方括号不同。
由于对象属性只允许以字符串命名,编译器会自动将您的数组强制转换为字符串(本质上调用其本地的`toString()`函数,对于数组,它会使用逗号连接所有元素)。
因此,当您将数组传递给对象的属性访问器/索引时,它会执行以下操作:
myArray1 ==> "a";
myArray2 ==> "b";
myArray3 ==> "a" + "," + "b" ===> "a,b";

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接