Получение случайных чисел при вызове функции с аргументом, начинающимся с нуля

У меня есть элементы в списке с 8 цифрами, и большинство из них начинаются с двух нулей. Когда я хочу вызвать функцию и передать ее уникальный номер, почти всегда, когда она начинается с «00», она получает какие-то, казалось бы, случайные числа. Я до сих пор не знаю, как и почему это происходит. Вот пример на JSFiddle.

HTML:

<div id="working">
  <input type="button" onclick="sample(00119001)" value="00119001" /><br/>
  <input type="button" onclick="sample(00113008)" value="00113008" /><br/>
  <input type="button" onclick="sample(68745696)" value="68745696" /><br/>
  <input type="button" onclick="sample(11112222)" value="11112222" /><br/>
</div>
<div id="notworking">
  <input type="button" onclick="sample(00113004)" value="00113004" /><br/>
  <input type="button" onclick="sample(00113003)" value="00113003" /><br/>
  <input type="button" onclick="sample(00106002)" value="00106002" /><br/>
  <input type="button" onclick="sample(00120003)" value="00120003" /><br/>
</div>
<div id="show"></div>

JS:

function sample(a) {
  var b = "0000000"+a;
  b = b.substr(b.length-8);
  document.getElementById("show").innerHTML="Input: "+a+" | Output: "+b;
}

Чтобы прояснить проблему: я ожидаю получить тот же номер в функции, которая использовалась в аргументе для ее вызова, но по какой-то причине иногда я получаю совершенно другой номер.


person agapetos    schedule 20.10.2013    source источник


Ответы (2)


Прав ли я, думая, что эти числа являются идентификаторами / справочными номерами чего-то или другого? Если это так, то лучше хранить их в виде строк, а не чисел:

<input type="button" onclick="sample('00119001')" value="00119001" /><br/>
person David Knipe    schedule 20.10.2013

00113004 интерпретируется как восьмеричное. Этого не происходит, когда у вас есть 8 или 9 в вашем литерале, потому что движок js догадывается, что он не может быть восьмеричным.

Чтобы сделать десятичный литерал, удалите 0 в начале

<input type="button" onclick="sample(113004)" value="00113004" /><br/>

Если вы действительно хотите иметь 0, используйте строку:

 <input type="button" onclick="sample('00113004')" value="00113004" /><br/>

function sample(a) {
  var b = "0000000"+Number(a);
  b = b.substr(b.length-8);
  document.getElementById("show").innerHTML="Input: "+a+" | Output: "+b;
}
person Denys Séguret    schedule 20.10.2013
comment
Как насчет 4-го случая, который работает - там только 1 и 2 (11112222). Это потому, что это 8-значная комбинация символов, где первая единица не равна нулю? - person agapetos; 20.10.2013
comment
Числовой литерал, не начинающийся с 0, интерпретируется как десятичный. Это нормальная интерпретация: вы никогда не начинаете числовой литерал с 0, если только вы не хотите, чтобы он интерпретировался как восьмеричный. - person Denys Séguret; 20.10.2013