无意中,在我的项目中,我使用了以下代码,我很惊讶地看到它正在运行:
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时,它总是获取第一个元素并将其用作对象键。
我只是想知道这个概念叫什么,为什么会这样?
答案 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----"
答案 2 :(得分:2)
这是自动投射。在Javascript中,只有字符串可以索引到对象的属性中。 myObject
不是数组,而是一个对象。即使您使用括号来访问它的属性,它也与数组对象上使用的括号不同。
由于只允许通过字符串命名对象属性,编译器会自动将数组转换为字符串(本质上调用它的本机toString()
函数,对于数组,它使用逗号连接所有元素)。
因此,当您将数组传递给对象的属性访问器/索引时,它会执行以下操作:
myArray1 ==> "a";
myArray2 ==> "b";
myArray3 ==> "a" + "," + "b" ===> "a,b";