【问题标题】:Why in JavaScript does 10 === 010 result in false [duplicate]为什么在 JavaScript 中 10 === 010 会导致错误 [重复]
【发布时间】:2015-05-23 15:24:59
【问题描述】:

为什么在 JavaScript 中会出现以下错误:

10 === 000000010 (false)

但这结果为真:

010 === 000000010 (true)

在所有情况下left和right都是10,它们都应该导致true,不是吗?

【问题讨论】:

  • 1 == 011 === 01 在我的浏览器 (Chrome) 中都是正确的
  • 我在 Firefox 控制台中试过,但是 1 == 01 (true) 1 === 01 (true)
  • 你确定你没有真正尝试过10 == 010
  • 010 是八进制,相当于8
  • 问题应该是“为什么是10 != 010?”

标签: javascript


【解决方案1】:

0s 开头的 JavaScript 数字,后跟任何数字 01234567octal (base 8),而不是十进制(以 10 为基数)。

您可以在这样的示例中看到这一点:

10 === 010 // false
8 === 010 // true

请注意,如果有 89 数字,则它不是有效的八进制数,因此将被解释为十进制数:

89 === 089 // true

请注意,八进制文字在严格模式下不起作用:

(function(){ "use strict"; return 010 === 10; })()
// SyntaxError: Octal literals are not allowed in strict mode.

这在B.1.1 of the JavaScript specification 部分中被描述为与旧版本 ECMAScript 兼容的非规范行为。八进制整数字面量定义如下:

OctalIntegerLiteral ::
    0 OctalDigit
    OctalIntegerLiteral OctalDigit

OctalDigit :: one of
    0 1 2 3 4 5 6 7

【讨论】:

  • "如果有 8 位或 9 位,它...将被解释为十进制数" Javascript 这样做,不是吗。
【解决方案2】:

除了您当前的示例,以 0 为前缀且仅包含数字 0-7 的数字被解释为 octal。一个更好的例子是

123 == 0123 // nope

因为以 10 为底的 012383


使其与您更新的示例内联

parseInt(10, 10) // 10
parseInt(000000010, 10) // 8
parseInt(010, 10) // 8

【讨论】:

  • 吹毛求疵,parseInt的第一个arg应该是字符串,会影响结果。
  • @K3N 来自文档 ~ "要解析的值。如果字符串不是字符串,则将其转换为一个。忽略字符串中的前导空格。" .我认为这是安全的,主要是为了向 OP 展示 base10 中的每个值是什么
  • @Phil 尝试运行确定,它会强制转换它们,但如果您将这些数字作为字符串提供,结果会有所不同(即parseInt("000000010", 10) // = 10 只是说
  • @K3N 还好我没有传入字符串
  • @K3N:但parseInt(010, 10) 的作用与parseInt(8, 10) 相同。您可以尝试 parseInt(010, 10)parseInt("010", 10) 来显示差异,但在有关文字值的问题中使用 parseInt 没有意义。
猜你喜欢
  • 2016-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-16
  • 1970-01-01
  • 2021-11-06
  • 1970-01-01
相关资源
最近更新 更多