【问题标题】:Confused about javascript object keys对javascript对象键感到困惑
【发布时间】:2014-11-28 00:19:43
【问题描述】:

如果我在 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'] 所以我假设数字 0023122 转换为属性一个键9810,因为我可以执行myobject['9810'] 并得到结果。

有趣的是,我可以做到myobject[99999]myobject['99999'],因此即使我丢失了前导零,javascript 也不需要拒绝我的密钥。我不是在谈论什么是错什么是对,只是将数字 0023122 转换为 9810甚至 0023123 优雅地转换为 23123 的原因是什么 @ 987654332@ 转换为99999

  • 我认为这个数字太大了,所以我尝试使用更大的数字。
  • 如果删除前导零,则键变为“23123”

【问题讨论】:

  • 它在成为密钥之前已被转换。引用它以保留零。无论如何,所有对象键都是字符串,因此只需以字符串开头并避免您演示的问题。
  • 解决方案是“使用严格”。
  • @elclanrs:使用严格如何影响数字上的额外前导零?零仍然会被丢弃,它们只是不会留下八进制......

标签: javascript javascript-objects octal


【解决方案1】:

Javascript 支持八进制数:

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

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

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

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

091 -> 91

但是

071 -> 57

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

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

【讨论】:

  • 甜,我知道它有一个解释。我对此有疑问,这解释了它。 0999 不计算为八进制, 0123 或其他任何值。谜底:)
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-03-05
      • 1970-01-01
      • 1970-01-01
      • 2017-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多