Я немного опоздал на вопрос, но думаю, что могу дать хороший ответ.
Принятый ответ не говорит вам ничего более того, что вы на самом деле знаете, и упоминает в самом вопросе: Number(value)
работает как +value
, но не как parseInt(value)
.
Ключ должен знать, что есть семантическая разница между преобразованием типа и синтаксическим анализом .
Почему восьмеричное число преобразуется в десятичное число?
Поскольку конструктор Number вызывается как функция (Number(value)
) и Unary +
Operator (+value
) за сценой, используется ToNumber
внутренняя операция. Целью этих конструкций является преобразование типов .
Когда ToNumber
применяется к строковому типу , используется специальное грамматическое произведение, называемое StringNumericLiteral
.
Эта продукция может содержать только литералы Decimal и Hexadecimal Integer:
...
StrNumericLiteral :::
StrDecimalLiteral
HexIntegerLiteral
...
Есть также семантические различия между этой грамматикой и грамматикой "нормального" NumericLiterals
.
A StringNumericLiteral
:
- Может предшествовать и / или следовать за пробелами и / или символами конца строки.
- Это десятичное число может иметь любое количество первых 0 цифр. без восьмеричных чисел!
- Десятичному символу может предшествовать + или - для обозначения его знака.
- То, что пусто или содержит только пробел, преобразуется в + 0.
Теперь я пойду с функциями parseInt
и parseFloat
.
Очевидно, что целью этих функций является синтаксический анализ , который семантически отличается от преобразования типа , например:
parseInt("20px"); // 20
parseInt("10100", 2); // 20
parseFloat("3.5GB"); // 3.5
// etc..
Стоит отметить, что алгоритм parseInt
изменен в спецификации ECMAScript 5-го издания, он больше не интерпретирует основание числа как восьмеричное только для начального нуля:
parseInt("010"); // 10, ECMAScript 5 behavior
parseInt("010"); // 8, ECMAScript 3 behavior
Как вы можете видеть, это внесло несовместимость в поведение между реализациями ES3 и ES5, и, как всегда, рекомендуется использовать аргумент radix, чтобы избежать любых возможных проблем.
Теперь ваш второй вопрос:
Почему восьмеричные литералы удаляются из ECMAScript 5th Edition в строгом режиме?
На самом деле, эта попытка избавиться от восьмеричных литералов происходит с 1999 года. Восьмеричные производные литералов (OctalIntegerLiteral
и OctalEscapeSequence
) были удалены из грамматики NumericLiteral
с начиная со спецификации ECMAScript 3rd Edition , они могут быть включены для обратной совместимости ( также в ES5 ) с более старыми версиями стандарта.
Фактически, они включены во все основные реализации, но технически совместимая с ES3 или ES5 реализация может предпочесть не включать их, потому что они описаны как ненормативный .
Это был первый шаг, теперь ECMAScript 5 Строгий режим полностью их запрещает.
Но почему?
Поскольку они считались подверженными ошибкам функциями, и фактически в прошлом они вызывали непреднамеренных или трудных для обнаружения ошибок - так же, как та же проблема неявных восьмеричных чисел parseInt
-.
Теперь в строгом режиме восьмеричный литерал вызовет исключение SyntaxError
- в настоящее время наблюдается только в бета-версиях Firefox 4.0 -.