Javascript函数中的循环行为很奇怪
Strange for loop behavior in Javascript function
我的函数中有下面的循环
如果 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);
- JavaScript/Jquery:一个特殊用途的for循环函数
- 为循环函数中的元素指定单击
- Jquery下一个和上一个按钮循环函数
- 循环函数(Javascript回调帮助)
- 循环函数不起作用
- 使用ajax调用循环函数
- 在Javascript中修改循环函数的参数
- 如何循环函数数组并在单击时一次执行一个
- 设置超时可以保存我的循环函数不被视为无响应
- 具有超时的循环函数
- j查询如何在一系列延迟后循环函数
- 如何将 JavaScript forEach 循环/函数转换为 CoffeeScript
- for 循环函数似乎未运行
- 对于内部循环函数(新手)
- 循环函数会导致它在 javascript 中无响应
- 循环函数
- 如何优化循环函数
- JS拒绝循环函数
- 中断循环函数
- 在 JavaScript 中循环函数可以吗?