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);