为什么我的计算结果未定义?

时间:2009-11-30 01:17:25

标签: javascript

当我运行下面的javascript代码时,我将变量原始结束为

"1059823647undefinedundefinedundefinedundefinedundefinedundefinedundefinedundefinedundefinedundefined0"

为什么会发生这种情况,我该如何解决?

original="012345678901234567890";
document.write("<textarea>");
document.write(original);
document.write("</textarea>"+"<br>");

/* scramble */
var scramble='1059823647';
scramble=scramble.split('');

var scrambled=new Array();

original=original.split('');

for(i=0;i<original.length;i++){
  if(Math.round(Math.round(Math.floor(i/10)*10)+10)>=original.length){
    scrambled[i]=original[i];
  }else{
    scrambled[i]=original[Math.round(Math.round(Math.floor(i/10)*10)+scramble[i%10])];
  }
}

original='';

for(i=0;i<scrambled.length;i++){
  original+=scrambled[i];
}

document.write("<textarea>");
document.write(original);
document.write("</textarea>"+"<br>");

2 个答案:

答案 0 :(得分:3)

未定义正在打印,因为您的等式:

Math.round(Math.round(Math.floor(i/10)*10)+scramble[i%10])

返回数组范围之外的数字“原始”

例如,当i = 10时,等式返回101.

我不完全确定,但我认为你的意思是:

(Math.floor(i/10)*10) + Number(scramble[i%10])

答案 1 :(得分:0)

你正在使用字符串。但是把它们看作数字。 JavaScript会将数字的字符串表示转换为实际数字,但仅在需要时...而+运算符不需要这样的转换,因为它充当连接运算符字符串。

因此,这个表达式:

Math.round(Math.floor(i/10)*10)+scramble[i%10]

...正在将第一个操作数转换为字符串并附加scramble数组中的元素。在前十次迭代中你没有注意到这一点,因为当i&lt; 10时,第一个表达式的计算结果为0 ......但在那之后,你突然在每个争夺元素前加上“10”,并试图访问{{1索引&gt; = 100 ...其中没有定义。

解决方案:

在使用之前将字符串转换为数字。

original