Параметр функции JavaScript

Я пытаюсь передать число в свою функцию 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 вычисляет неожиданное значение?»

Drew Noakes 12.01.2009 12:50
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
1
2 239
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

ОБНОВЛЕНИЕ: Спасибо @Paul Dixon за то, что немного разбудил меня этим утром. 01004 является буквальным, поэтому никакое количество постфактум, то есть parseInt, не будет обновлять базу числа. Вам нужно либо убрать начальный 0 в коде, чтобы сделать его 1004 (самое простое решение), либо заключить в кавычки литерал, чтобы сделать его строкой перед отправкой в ​​parseInt (что требует больше работы по непонятной мне причине).

Спасибо за быстрый ответ! Я попробовал выполнить parseInt по номеру, но все равно получаю 516 в окне предупреждения. Должен ли я преобразовать 01004 в число, даже до того, как передам это в функцию JavaScript !?

Veera 12.01.2009 12:32

Забавно то, что если я помещаю явный parseInt (num, 10) в тело test, он все равно не работает. Если я заключу 01004 в кавычки, например, test ('01004'), это сработает.

Hank Gay 12.01.2009 12:40

Процитируйте число -> '01004'

Обновлено: я вижу, что parseInt ('01004', 10) работает нормально ... Я действительно не знаю, почему parseInt (01004, 10) не работает

EDIT2: Хорошо, спасибо Полу Диксону

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

Hank Gay 12.01.2009 12:40

Это работает только потому, что это больше не число, это строка ... Исходя из исходного вопроса, я предполагаю, что требуется число.

James 12.01.2009 12:42

он превращает его из числового литерала, выраженного в восьмеричном формате, в строковый литерал

Paul Dixon 12.01.2009 12:42

Я предположил, что он хочет передать строку: 01004 - это не число, а 1004.

tanathos 12.01.2009 12:44

Да, но почему parseInt с явной базой 10 не работает? предупреждение (parseInt (01004, 10)) -> 516

Hank Gay 12.01.2009 12:45

01004 - это просто еще один способ записи 516, поэтому alert (parseInt (01004, 10)) эквивалентен alert (parseInt (516, 10))

Paul Dixon 12.01.2009 12:49

эхе, я думаю, что Хэнк имеет право, может быть, наличие первого нуля потянет javascript, чтобы оценить число как восьмеричное, и обойти эту функцию. Но с предупреждением (parseInt ('01004', 10)) он работает правильно

tanathos 12.01.2009 12:49

Ага! Конечно, это является. Вот что происходит, когда вы отвечаете перед кофе: вы убеждаете себя, что числовой литерал будет проанализирован как строковый литерал. Спасибо, что мирились с плотностью.

Hank Gay 12.01.2009 12:51
Ответ принят как подходящий

Числовой литерал, начинающийся с нуля, интерпретируется как восьмеричный, поэтому запись 01004 равна точно, как запись 516.

Некоторые другие ответы, предлагающие использовать parseInt внутри функции для преобразования восьмеричного значения в десятичное.

Это не поможет, поскольку в функцию передается числовое значение 516. Если вы попросите parseInt дать вам интерпретацию по основанию 10, вы получите 516!

Способ исправить это - либо потерять ведущий ноль, либо, если ноль требуется, сделать его строковым литералом, а не числовым, и использовать parseInt (num, 10) внутри функции.

Поздравляем, вы стали миллионным покупателем, которого сбили с толку восьмеричные литералы в языке, происходящем от B (и, следовательно, C).

Ваш приз - провести парад вил возле дома Кена Томпсона.

Вы никогда не забудете свой первый восьмеричный буквальный коктейль :)

Paul Dixon 12.01.2009 15:44

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