Почему в 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.
Чтобы привести его в соответствие с вашим обновленным примером