回答第一个问题:
是的,MDN 指南中给出的声明并不是 100% 准确,但在您的日常工作中最好遵循它作为规则。您确实不需要创建数字属性名称。
回答第二个问题:
属性名称不能以数字开头,但名称中不含任何其他字符的数字属性名称就可以。
存在此异常的原因是名称编号相同的属性indexes
.
让我们试试这个:
var obj = {7: "abc"};
obj[7]; // works fine
obj.7; // gives an error (SyntaxError)
现在尝试打电话Array.push
放在物体上并观察会发生什么:
Array.prototype.push.call(obj, "xyz");
console.log(obj);
console.log(obj[0]);
// Prints
Object {0: "xyz", 7: "abc", length: 1}
"xyz"
您可以看到很少有新属性(一个名称为0
另一个有名字的length
) 已添加到对象中。此外,您可以将该对象用作数组:
var obj = { "0": "abc", "1": "xyz", length: 2 };
Array.prototype.pop.call(obj); // Returns: "xyz"
Array.prototype.pop.call(obj); // Returns: "abc"
您可以在对象上使用数组的方法,这称为Duck Typing.
数组只不过是具有一些预定义方法的对象。
From MDN:
数组元素是对象属性,就像 length 是属性一样,但尝试使用点表示法访问数组元素会引发语法错误,因为属性名称无效。 JavaScript 数组和导致这种情况的属性没有什么特别的。以数字开头的 JavaScript 属性不能用点表示法引用,必须使用方括号表示法访问。
现在您可以理解为什么属性名称的数字是有效的。这些被称为索引,它们在 JavaScript 数组中使用。由于 JavaScript 需要与其他语言保持一致,因此数字对于索引/属性名称是有效的。
希望这能够清楚地说明这一点。
以下是一些有趣的文章:
- JavaScript 标识符(在 ECMAScript 5 中)
- JavaScript 标识符(在 ECMAScript 6 中)