Javascript函数中的循环行为很奇怪

Strange for loop behavior in Javascript function

本文关键字:循环 函数 Javascript      更新时间:2023-09-26

我的函数中有下面的循环

如果 x 为 <10,

我看到它循环通过,但如果它大于 10,即使 y

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),但当我尝试插入之前到(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
     }
}

反对选民:介意解释吗?

发现的问题:调试时,我看到哪个元素I并在' '中插入BeforeI值。所以我假设它把它当作一个字符串,正如 nnnnn 和 paxdiablo 正确指出的那样,它采用字符串而不是 int,所以它适用于哪个元素I = 9 和插入之前I = 2 而不是哪个元素 I= 10,插入之前 I = 2。

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

谢谢

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

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

。而不是

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

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

对于字符串"2" < "9"true,但"2" < "10"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) 
   }       
}

我不知道哪个元素I和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
  }
}

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

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

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

但以下没有:

insert ( '10', '2')

那是因为字符串'10'实际上小于字符串'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);