-2

我的函数中有以下循环

如果 x <10,我看到它循环,但如果它大于 10,即使 y < x 的条件满足,它也会失败

function insert(x,y) {

   for (var shift = y; shift < x; shift++) {
      //get into loop for insert (9,2) but not for insert(10,2) 
   }       

}

这是实际功能,我正在尝试使用 rapheal.js 在场景之前可视化插入,它适用于 insertBeforeTo(9,2) 但是当我尝试 insertBeforeTo(10,2) 时,它不会进入循环。

function insertBeforeTo(whichElementI, insertBeforeI) {

     var twhichElement = blocks[whichElementI];
     blocks[whichElementI].animate({ x: blocks[insertBeforeI].attr('x') }, 1000, ">");
     var shiftplusone = insertBeforeI;
     for (var shift = insertBeforeI; shift < whichElementI; shift++) {

         ++shiftplusone;
         blocks[shift].animate({ x: blocks[shiftplusone].attr('x') }, 1000, ">");// check  value actually changes

     }
}

下选民:介意解释吗?

发现问题:在调试时,我看到“”中的 whichElementI 和 insertBeforeI 值。所以我假设它把它当作一个字符串,正如 nnnnn 和 paxdiablo 正确指出的那样,它把它当作字符串而不是 int 所以它适用于 whichElementI = 9 和 insertBeforeI = 2 而不是 whichElementI= 10 ,insertBeforeI=2。

所以我使用了像 +whichElementI, +insertBeforeI 这样的一元加运算符来解决这个问题。

谢谢

4

3 回答 3

1

您应该首先检查您传递给函数的数据类型。

例如,所有这些都会产生输出:

insert ( 10,   2)
insert (  9,   2)
insert ( '9', '2')

但以下没有:

insert ( '10', '2')

那是因为string '10'实际上小于 string '2'。我的意思是在排序或比较时不对字符串进行数字处理,而是单独比较每个字符,从而导致前十二个数字被排序为:

1
10
11
12
2
3
4
5
6
7
8
9

您可以使用以下代码(在众多在线 JS 运行器之一)看到这一点:

function insert(x,y) {
   for (var shift = y; shift < x; shift++) {
      //get into loop for insert (9,2) but not for insert(10,2) 
      document.write('x');
   }       
}
document.write('<br>10,2 as string: '); insert ('10','2');
document.write('<br>9,2 as string: ');  insert ( '9','2');
document.write('<br>9,2 as num: ');     insert (  9,  2);
document.write('<br>10,2 as num: ');    insert ( 10,  2);

输出:

10,2 as string: 
9,2 as string: xxxxxxx
9,2 as num: xxxxxxx
10,2 as num: xxxxxxxx

如果您有一个要视为数字的字符串,这parseInt()是一种方法,例如:

var str42 = '42';
var num42 = parseInt (str42, 10);
于 2012-06-26T02:02:08.410 回答
1

我猜你无意中用字符串值而不是数字值调用你的函数,也就是说

insert("9", "2")
insert("10", "2")

...而不是

insert(9, 2)
insert(10, 2)

例如,如果您从 html 元素属性中获取值,它们将是字符串。

使用strings , "2" < "9"is true, but "2" < "10"is false- 它进行字典(字典)顺序比较,而不是数字比较。

如果您希望您的函数以任何一种方式工作,那么您可以将其更改为将字符串转换为数字(为此我更喜欢使用一元加运算符):

function insert(x,y) {

   x = +x;
   y = +y;

   for (var shift = y; shift < x; shift++) {
      //get into loop for insert (9,2) but not for insert(10,2) 
   }       

}
于 2012-06-26T02:02:12.023 回答
1

我不知道whichElementI和insertBeforeI是什么类型,但是通过*1将它们转换为数字。这应该有助于控制一些算术。可能还想检查 if(isNaN(some_var)==false){...} 作为健全性检查。

function insertBeforeTo(whichElementI, insertBeforeI) {

 var twhichElement = blocks[whichElementI];
 blocks[whichElementI].animate({ x: blocks[insertBeforeI].attr('x') }, 1000, ">");
 var shiftplusone = insertBeforeI*1;
 for (var shift = insertBeforeI*1; shift < whichElementI*1; shift++) {
    ++shiftplusone;
    blocks[shift].animate({ x: blocks[shiftplusone].attr('x') }, 1000, ">");// check x value  actually changes

  }
}
于 2012-06-26T02:08:27.487 回答