Я пытаюсь передать число в свою функцию JavaScript, но на самом деле передается неправильное значение. Я привожу здесь весь код:
<html>
<head>
<script type = "text/javascript">
function test(num)
{
/*It should alert as 01004 or 1004 but to my surprise it's alerting as 516!*/
alert(num);
}
</script>
</head>
<body>
<a href = "javascript:test(01004);">Test it!</a>
</body>
</html>
В приведенном выше коде вместо 01004, если я передаю его как 10040, я получаю правильное значение в поле предупреждения.
Есть идеи по поводу этого странного дела?
Заранее спасибо.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Начальный ноль, вероятно, заставляет его думать, что число восьмеричное.
ОБНОВЛЕНИЕ: Спасибо @Paul Dixon за то, что немного разбудил меня этим утром. 01004 является буквальным, поэтому никакое количество постфактум, то есть parseInt, не будет обновлять базу числа. Вам нужно либо убрать начальный 0 в коде, чтобы сделать его 1004 (самое простое решение), либо заключить в кавычки литерал, чтобы сделать его строкой перед отправкой в parseInt (что требует больше работы по непонятной мне причине).
Спасибо за быстрый ответ! Я попробовал выполнить parseInt по номеру, но все равно получаю 516 в окне предупреждения. Должен ли я преобразовать 01004 в число, даже до того, как передам это в функцию JavaScript !?
Забавно то, что если я помещаю явный parseInt (num, 10) в тело test, он все равно не работает. Если я заключу 01004 в кавычки, например, test ('01004'), это сработает.
Процитируйте число -> '01004'
Обновлено: я вижу, что parseInt ('01004', 10) работает нормально ... Я действительно не знаю, почему parseInt (01004, 10) не работает
EDIT2: Хорошо, спасибо Полу Диксону
Это действительно исправляет, но я не могу понять почему.
Это работает только потому, что это больше не число, это строка ... Исходя из исходного вопроса, я предполагаю, что требуется число.
он превращает его из числового литерала, выраженного в восьмеричном формате, в строковый литерал
Я предположил, что он хочет передать строку: 01004 - это не число, а 1004.
Да, но почему parseInt с явной базой 10 не работает? предупреждение (parseInt (01004, 10)) -> 516
01004 - это просто еще один способ записи 516, поэтому alert (parseInt (01004, 10)) эквивалентен alert (parseInt (516, 10))
эхе, я думаю, что Хэнк имеет право, может быть, наличие первого нуля потянет javascript, чтобы оценить число как восьмеричное, и обойти эту функцию. Но с предупреждением (parseInt ('01004', 10)) он работает правильно
Ага! Конечно, это является. Вот что происходит, когда вы отвечаете перед кофе: вы убеждаете себя, что числовой литерал будет проанализирован как строковый литерал. Спасибо, что мирились с плотностью.
Числовой литерал, начинающийся с нуля, интерпретируется как восьмеричный, поэтому запись 01004 равна точно, как запись 516.
Некоторые другие ответы, предлагающие использовать parseInt внутри функции для преобразования восьмеричного значения в десятичное.
Это не поможет, поскольку в функцию передается числовое значение 516. Если вы попросите parseInt дать вам интерпретацию по основанию 10, вы получите 516!
Способ исправить это - либо потерять ведущий ноль, либо, если ноль требуется, сделать его строковым литералом, а не числовым, и использовать parseInt (num, 10) внутри функции.
Поздравляем, вы стали миллионным покупателем, которого сбили с толку восьмеричные литералы в языке, происходящем от B (и, следовательно, C).
Ваш приз - провести парад вил возле дома Кена Томпсона.
Вы никогда не забудете свой первый восьмеричный буквальный коктейль :)
Вы можете переименовать этот вопрос в более описательный, например «Почему этот числовой литерал JavaScript вычисляет неожиданное значение?»