2014-10-02 122 views
3

如果我在javascript中定义了一个新对象,使用var myobject = {}我将有一个空对象,如预期的那样。但是,我不明白这背后的逻辑。请注意,所有的工作,但我不明白这一点,更多的是逗比什么都重要:关于JavaScript对象键的困惑

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访问这些属性,但我可以” t通过这样做myobject['0023122']要么所以我假设数字0023122转换为财产与一个密钥9810因为我可以myobject['9810']并得到结果。

有趣的是,我可以做myobject[99999]myobject['99999']所以JavaScript不需要拒绝我的密钥,虽然我失去了我的前导零。我说的不是出了什么问题,并有权这样做,正是针对数0023122的原因转换为9810 甚至 0023123优雅地转换为23123正如 0099999转换为99999

  • 我假设它的数量太大了,这就是为什么我尝试使用更大的一个。
  • 如果删除了前导零的关键变成了“23123”
+1

它被转换,然后它成为一个关键。引用它来保存零。无论如何,所有的对象键都是字符串,所以只需从strign开始,避免你演示的问题。 – dandavis 2014-10-02 22:20:29

+0

解决方案是“严格使用”。 – elclanrs 2014-10-02 22:21:44

+0

@elclanrs:如何严格影响数字上的额外前导零?零仍然会被扔掉,他们只是不会留下一个八进制... – dandavis 2014-10-02 22:22:17

回答

5

的Javascript支持八进制数:

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

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

因此,任何数量的具有小于8的所有数字,但具有0开始,将被转换为八进制。

如果它有一个8或9,它会被截断。如果它与一个0

091开始 - > 91

071 - > 57

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

myobject["001111"] = "001111" 
myobject[001111] = 585 
+0

甜,我知道它有一个解释。我有这个问题,这解释了它。 0999不计算为八进制,0123或任何其他。神秘结局:) – 2014-10-02 22:34:10

1

如果JS星号中的数字ts与零,它被认为是八进制的,这就是密钥被转换的原因。 myobject[0099999]可能实际上会导致错误,因为它不包含9s(但这可能会因浏览器/解释器而异)

1

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

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

查看更多这里:http://www.ecma-international.org/ecma-262/5.1/#sec-7.8.3