为什么这个Javascript数组中的项目位于错误的单元格中?

Pet*_*son 2 javascript arrays

有人写了这个(非常糟糕的)函数来将数值从0-999翻译成英文单词.

function getNumberWords(number) {
  var list = new Array(1000);
  list[000] = "zero";
  list[001] = "one";
  list[002] = "two";
  list[003] = "three";
  ///skip a few
  list[099] = "ninety nine";
  list[100] = "one hundred";
  list[101] = "one hundred and one";
  ///skip a few more
  list[997] = "nine hundred and ninety seven";
  list[998] = "nine hundred and ninety eight";
  list[999] = "nine hundred and ninety nine";
  return list[number];
}
Run Code Online (Sandbox Code Playgroud)

这里有一些相当奇怪的错误,我似乎无法弄清楚原因.一些但不是所有元素都放在错误的单元格中.

我尝试显示列表的contentes,它显示了一个非常时髦的结果:

> list.toString();
"zero,one,two,three,four,five,six,seven,ten,eleven,twelve,thirteen,fourteen,
fifteen,sixteen,seventeen,twenty,twenty one,twenty two,twenty three,twenty four,
twenty five,twenty six,twenty seven,thirty,thirty one,thirty two,thirty three,
thirty four,thirty five,thirty six,thirty seven,forty,forty one,forty two,"
///(skip a few)
"sixty six,sixty seven,seventy,seventy one,seventy two,seventy three,seventy four,
seventy five,seventy six,seventy seven,,,,,sixty eight,sixty nine,,,,,,,,,
seventy eight,seventy nine,eighty,eighty one,eighty two,eighty three,eighty four,"
///(and so on)
Run Code Online (Sandbox Code Playgroud)

也就是说,元素0-7具有期望值.元素68,69和78-999也具有预期值.元素64-67和70-77是空的.元素8-63具有不正确的值.

世界上到底发生了什么?为什么15个细胞是空的,56个细胞是不正确的,其余的是正确的?

Lig*_*ica 5

以...开头的数字文字0被解释为八进制值(如果可以的话) - 即base-8中的数字.这是Javascript,C,C++,PHP,Perl,Bash和许多其他语言的情况.

现在,base-8 22是base-10,18因此您无法访问您认为自己的元素.你的前八个阵列元素很好,因为当然,base-8 0也是base-10 0,依此类推7.像069这样的值不会引起混淆,因为它不能代表base-8中的任何内容,因此Javascript会回落到base-10.呸!


我建议使用间距来代替:

function getNumberWords(number) {
  var list = new Array(1000);
  list[  0] = "zero";
  list[  1] = "one";
  list[  2] = "two";
  list[  3] = "three";
  ///skip a few
  list[ 99] = "ninety nine";
  list[100] = "one hundred";
  list[101] = "one hundred and one";
  ///skip a few more
  list[997] = "nine hundred and ninety seven";
  list[998] = "nine hundred and ninety eight";
  list[999] = "nine hundred and ninety nine";
  return list[number];
}
Run Code Online (Sandbox Code Playgroud)

我还建议创建一个即时生成字符串的新函数; 它不应该是税收,当然不会比每次调用创建这个数组更多.