为什么在JavaScript中10 === 010导致错误

use*_*254 15 javascript

为什么在JavaScript中以下结果为false:

10 === 000000010 (false)
Run Code Online (Sandbox Code Playgroud)

但结果如下:

010 === 000000010 (true)
Run Code Online (Sandbox Code Playgroud)

在所有情况下左右都是10,他们应该都是真的,不应该吗?

Pet*_*son 23

以前导0s后跟任何数字开头的JavaScript编号01234567八进制(基数为8)而不是十进制(基数为10).

你可以在这样的例子中看到这个:

10 === 010 // false
8 === 010 // true
Run Code Online (Sandbox Code Playgroud)

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

89 === 089 // true
Run Code Online (Sandbox Code Playgroud)

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

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

在JavaScript规范的B.1.1节中描述为与旧版ECMAScript兼容的非规范行为.八进制整数文字定义如下:

OctalIntegerLiteral ::
    0 OctalDigit
    OctalIntegerLiteral OctalDigit

OctalDigit :: one of
    0 1 2 3 4 5 6 7
Run Code Online (Sandbox Code Playgroud)

  • "如果有8位或9位数,它......将被解释为十进制数"Javascript _would_这样做,不会. (2认同)

Phi*_*hil 8

您当前的示例无法承受,前缀为0仅包含数字0-7的数字将被解释为八进制.一个更好的例子是

123 == 0123 // nope
Run Code Online (Sandbox Code Playgroud)

因为0123在基地10是83.


使其与您更新的示例一致

parseInt(10, 10) // 10
parseInt(000000010, 10) // 8
parseInt(010, 10) // 8
Run Code Online (Sandbox Code Playgroud)

  • @Phil尝试运行肯定,它投射它们,但如果你提供这些数字作为字符串,结果将是不同的(即``parseInt("000000010",10)// = 10`只是说 (2认同)