*** ВНИМАНИЕ: Блог переехал на другой адрес - demin.ws ***

пятница, 2 апреля 2010 г.

parsetInt() в JavaScript'e

Напоролся на совершенно замечательное поведение в parseInt()'e:

Я думал, что код ниже должен давать мне числа от 0 до 9:

<script>
var n = [ '00', '01', '02', '03', '04', '05', '06', '07', '08', '09' ];
for (var i = 0; i < n.length; ++i)
  document.writeln(parseInt(n[i]));
</script>

Но выводится:

0 1 2 3 4 5 6 7 0 0

И это поведение законно, так как лидирующие нули рассматриваются как признак восьмеричного числа, а 8 и 9 не являются восьмеричными знаками.

Правильно надо писать так:

<script>
var n = [ '00', '01', '02', '03', '04', '05', '06', '07', '08', '09' ];
for (var i = 0; i < n.length; ++i)
  document.writeln(parseInt(n[i], 10));
</script>
По хорошему, второй аргумент parseInt()'а, задающий систему исчисления, должен быть обязательным, чтобы исключить путаницу.

2 комментария:

  1. почему тогда не удивляет подобное поведение в C/C++/Java
    типа int i = 09;
    правда это приводит к ошибке компиляции, однако всё то, что валидно для 8ричной системы, например 010, будет вполне нормально "съедено"

    ОтветитьУдалить
  2. Да и в C/C++/Java такое поведение лично мне не очень нравится. Но когда мы имеем функцию именно парсинга, то есть именно ожидаемого преобразования, а не просто определения константы, то столько алогичное поведение, как мне кажется, порождает реальное количество ошибок преобразования. Забыл задать radix - получишь глюки в парсинге дат, например, и т.д. Жить, конечно, можно, но хочется лучшего.

    ОтветитьУдалить