数组键是否隐式强制转换为数字?

时间:2017-09-16 03:06:28

标签: javascript arrays javascript-objects coercion

我在书中,这个&对象原型,第3章:对象。

在数组部分,作者说如果你向一个数组添加一个属性,但是数组看起来像一个数字,它将最终作为数组索引的一部分:

myArray["3"] = "baz";
console.log(myArray.length);
console.log(myArray[3]);

看起来JavaScript隐含地将“3”字符串强制转换为数字3,然后它将“baz”放在数组的索引3中。

1 个答案:

答案 0 :(得分:3)

实际上,反之亦然。 JavaScript对象中的所有键都是字符串,而数组是对象。这意味着myArray[3]myArray["3"] 相同,因为所有键(如果不是字符串)都被强制转换为字符串,因为所有JavaScript对象键都是字符串。每MDN

  

对象属性名称可以是任何有效的JavaScript字符串,也可以是任何可以转换为字符串的字符串,包括空字符串。

  

请注意,方括号表示法中的所有键都将转换为String类型,因为JavaScript中的对象只能将String类型作为键类型。例如,在上面的代码中,当密钥obj添加到myObj时,JavaScript将调用obj.toString()方法,并将此结果字符串用作新密钥。

例如:

const obj = {
  toString() {
    return 'foobar';
  }
};

const anotherObj = {};
anotherObj[obj] = 'baz';
//anotherObj.foobar is now 'baz'

由于obj被隐式转换为字符串,因此调用obj.toString,返回'foobar',用作键值。这同样适用于数组 - 使用括号表示法时。所有键都是字符串,使用括号表示法访问会将括号中的表达式强制转换为字符串。