Javascript ParseInt() с -1

Может кто-нибудь сказать мне, почему это var val="08"; alert(parseInt(val-1)); показывает 7 но var val="08"; alert(parseInt(val)-1); показывает -1?

Thnx

2 ответа

Решение

parseInt("08") дам тебе NaN если двигатель, который вы используете, расширяется parseInt распознать восьмеричное 0 означает "восьмеричный"). Это даст вам 8 если двигатель следует стандарту, который говорит, что не делать этого (по состоянию на ES5).

parseInt("08"-1) немного избыточно, потому что выражение "08"-1 приведет к числу (которое затем передается в parseInt); просто "08"-1 это все, что тебе нужно. Вот как это ломается:

  • Двигатель обрабатывает выражение "08" - 1 пытаясь повернуть "08" в число. На движке, который расширяет числовой литеральный синтаксис для включения восьмеричного, это может дать сбой, но на движках, которые этого не делают, это даст вам 8, Таким образом, результатом выражения является число 7 (8 - 1).

  • Двигатель тогда делает parseInt(7), который является избыточным, как 7 уже номер. Что происходит то 7 превращается в "7" а затем проанализировал обратно в 7,

Обратите внимание на разницу выше: результат parseInt("08") - 1 будет зависеть от того, что двигатель расширяет, что parseInt будет разбирать, но результат "08" - 1 будет зависеть от того, расширяет ли движок числовой литеральный синтаксис. Это две разные вещи, и спецификация ES5 не позволяет двигателям расширяться parseInt Синтаксис, но позволяет им расширять числовой буквальный синтаксис (см. §B.1.1), но только в свободном режиме. (Смущает, я знаю.)

Сообщение на вынос: всегда используйте основание с parseInt сказать ему, какую номерную базу использовать.

Всегда используйте parseInt(val,10); чтобы убедиться, что значение анализируется в десятичной системе. В вашем случае, когда вы предупреждаете val-1 т.е. 08-1 так что, это 7 т.е. parseInt(7) ==> 7

но когда вы делаете

parseInt(val)-1  ==> parseInt("08")-1 ==> 0-1 ==> -1

почему это становится 0? Ответ заключается в том, что предполагается, что вы хотите разобрать в системе счисления Octal.

Поэтому всегда используйте второй аргумент, т.е. parseInt(whatevervalue,10);

Другие вопросы по тегам