对javascript对象键感到困惑

时间:2014-10-02 22:16:27

标签: javascript javascript-objects octal

如果我在javascript中定义一个新的对象,var myobject = {}我会有一个空对象,如预期的那样。但是,我无法理解这背后的逻辑。请注意,这一切都有效,但我没有得到它,更多的是取笑:

var myobject = {};                 // Object{}
    myobject[001] = "001";         // Object {1: "001"}, So 001 turns to 1
    myobject[0099999] = "0099999"; // Object {1: "001", 99999: "0099999"}
    //Last line only makes sense after this one (shortened version)▼
    myobject[0023122] = "0023122"  // Object {... 9810: "0023122" ...}

我知道我无法使用myobject.0023122访问这些属性,因为它们以数字开头,但我不能这样做myobject['0023122'],所以我假设使用键9810将数字0023122转换为属性,因为我可以执行myobject['9810']并获得结果。

令人着迷的是,我可以myobject[99999]myobject['99999'],因此javascript不需要拒绝我的密钥,尽管我丢失了我的前导零。我不是在谈论什么是错的,也不是在做什么,只有0023122转换为9810甚至是0023123的原因是什么?在 0099999转换为99999

时,优雅地转换为23123
  • 我认为这个数字太大了,这就是为什么我尝试用更大的数字。
  • 如果您删除前导零,则键变为" 23123"

3 个答案:

答案 0 :(得分:5)

Javascript支持八进制数字:

  

正八进制数必须以0(零)开始,后跟八进制数字。

0023122(八进制)是9810(十进制)

因此,任何数字小于8但以0开头的数字都将转换为八进制数。

如果它有8或9,如果它以0开头则会被截断。

091 - > 91

但是

071 - > 57

当然,如果您使用字符串键,则无需担心:

 myobject["001111"] = "001111"
 myobject[001111] = 585

答案 1 :(得分:1)

如果JS中的数字以零开头,则假定它是八进制,这就是转换密钥的原因。 myobject[0099999]实际上可能会导致错误,因为它不是有效的八进制数,因为它包含9个(但这可能因浏览器/解释器而异)

答案 2 :(得分:1)

在代码myobject[0023122] = "0023122";中,用作对象索引的值被计算为整数原语。

前缀0使其被解释为OctalIntegerLiteral,这意味着0023122被评估为八进制。如果它是23122,它将被评估为IntegerLiteral。 0x23122会导致它被评估为HexIntegerLiteral。

在此处查看更多内容:http://www.ecma-international.org/ecma-262/5.1/#sec-7.8.3