Почему в JavaScript делает 10 === 010 результат в false

Почему в JavaScript есть следующие результаты в false:

10 === 000000010 (false)

Но это приводит к следующему:

010 === 000000010 (true)

Во всех случаях левые и правые равны 10, все они должны быть истинными, не должны ли они?

Ответы

Ответ 1

Номера JavaScript, начинающиеся с ведущего 0, за которым следует любая из цифр 01234567, восьмеричная (база 8), а не в десятичной ( основание 10).

Это можно увидеть в следующем примере:

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

Обратите внимание, что если есть цифра 8 или 9, она не является действительным восьмеричным числом и поэтому будет интерпретирована как десятичное число:

89 === 089 // true

Обратите внимание, что восьмеричные литералы не работают в строгом режиме:

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

Это описано в разделе B.1.1 спецификации JavaScript как ненормативное поведение для совместимости со старыми версиями ECMAScript. Циклический целочисленный литерал определяется следующим образом:

OctalIntegerLiteral ::
    0 OctalDigit
    OctalIntegerLiteral OctalDigit

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

Ответ 2

Ваш текущий пример не выдерживает, числа с префиксом 0, содержащие только цифры 0-7, интерпретируются как octal. Лучший пример:

123 == 0123 // nope

потому что 0123 в базе 10 83.


Чтобы привести его в соответствие с вашим обновленным примером

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