Я немного опоздал с вопросом, но я думаю, что могу дать хороший ответ.
Принятый ответ не говорит вам ничего больше, чем то, что вы на самом деле знаете, и упоминает в самом вопросе: Number(value)
работает как +value
, но не как parseInt(value)
.
Важно знать, что существует семантическая разница между преобразованием типов и анализом.
Почему строка восьмеричного числа преобразуется в десятичное число?
Поскольку конструктор чисел вызывается как функция (Number(value)
) и Унарный +
оператор (+value
) за кулисами использует ToNumber
внутренняя операция. Целью этих конструкций является преобразование типов.
Когда ToNumber
применяется к типу String, используется специальная грамматика, называемая StringNumericLiteral
.
Это производство может содержать только десятичные литералы и шестнадцатеричные целые литералы:
...
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 5th Edition. , он больше не интерпретирует систему счисления числа как восьмеричную только из-за наличия ведущего нуля:
parseInt("010"); // 10, ECMAScript 5 behavior
parseInt("010"); // 8, ECMAScript 3 behavior
Как видите, это привело к несовместимости в поведении между реализациями ES3 и ES5, и как всегда рекомендуется использовать аргумент radix, чтобы избежать возможных проблем.
Теперь ваш второй вопрос:
Почему восьмеричные литералы удаляются из ECMAScript 5th Edition в строгом режиме?
На самом деле, эта попытка избавиться от восьмеричных литералов предпринимается с 1999 года. Восьмеричные литералы (OctalIntegerLiteral
и OctalEscapeSequence
) были удалены из грамматики NumericLiteral
s с тех пор, как спецификация ECMAScript 3rd Edition, они могут быть включены для обратная совместимость (также в ES5 ) со старыми версиями стандарта.
На самом деле они включены во все основные реализации, но технически реализация, совместимая с ES3 или ES5, может не включать их, поскольку они описываются как ненормативные.
Это был первый шаг, теперь ECMAScript 5 строгий режим полностью их запрещает.
Но почему?
Поскольку они считались подверженными ошибкам, и на самом деле в прошлом они вызывали непреднамеренные или сложные ошибки — точно так же, как та же проблема неявных восьмеричных чисел parseInt
—.
Теперь в строгом режиме восьмеричный литерал вызовет исключение SyntaxError
, которое в настоящее время наблюдается только в бета-версиях Firefox 4.0.
person
Christian C. Salvadó
schedule
04.10.2010