2013-11-17 3 views
2

Я смущен о конкретном результате parseInt. Я думал, что я понял большинство своих причуд, но это неясно.parseInt («010», 10); против parseInt (010, 10);

parseInt("010", 10); // 10 

parseInt(010, 10); // 8, but expecting 10 

Во втором примере я указал правильный радиус. В чем причина неожиданного результата?

Решение

Проблема с восьмеричной буквальным. Когда число добавляется с 0, оно рассматривается как восьмеричный литерал.

При выполнении

console(010); // 8 

в режиме без сценария, вы получите 8. Причина, по которой ParseInt оказывает то, что я думал, было странное поведение, потому что я был в основном исполнении

parseInt(8, 10); // 8 

и ожидается 10.

ParseInt никогда не видел 010, только 8. Спасибо всем за помощь.

+2

Используйте строгий режим. – rninty

+4

Почему вы все равно хотите использовать parseInt в литерале Number? – bfavaretto

+0

Это не практическое применение, но я не мог перестать удивляться. – AndrewJM

ответ

7

Номер подвергается анализу перед передачей parseInt.

Например, это похоже на то, как это работает:

var x = 010; 
console.log(x); // 8 
parseInt(x, 10); 

Поскольку вы передаете 8 в, конечно, вы собираетесь получить 8 назад. Превращение числа с 0 сделает его восьмеричным литералом, в котором используется база из 8. Вы можете либо удалить ведущий 0 (с первым 0 на самом деле не имеет смысла), либо (как вы это делали в вашем вопросе) передайте его как строку.

Обратите внимание, что не все браузеры делают это, это просто те, которые совместимы с предыдущим кодом, который делает это (это не обязательно), и implementations must not parse octal literals in ES5 strict mode. Чтобы увидеть это в действительности, сравнить нестрогую версию:

(function() 
{ // not strict 
    parseInt(010, 10); 
})(); 

... который возвращает либо 8 или 10 (в зависимости от реализации), со строгой версией:

(function() 
{ "use strict"; 
    parseInt(010, 10); 
})(); 

Это будет приводят к SyntaxError: Octal literals are not allowed in strict mode..

9

Количество литералы, начинающиеся с нуля в octal, а не decimal, так 010 равно 8, если не работает под strict mode.

Важно отметить, что поведение parseInt зависит от того, какая версия ECMAScript (JavaScript) используется вашим браузером или если вы работаете в строгом режиме. См. Octal Interpretations with No Radix для более подробной информации.

Смежные вопросы