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

Javascript函数中奇怪的for循环行为,javascript,for-loop,Javascript,For Loop,我的函数中有下面的循环 如果x是的话,我可以看到它是循环的,你应该首先检查你传递给函数的数据类型 例如,所有这些都会产生输出: insert ( 10, 2) insert ( 9, 2) insert ( '9', '2') 但以下情况并非如此: 这是因为字符串'10'实际上小于字符串'2'。我的意思是,在排序或比较时,字符串不会被数字处理,而是每个字符都会被单独比较,导致像前12个数字这样的事情被排序为: 1 10 11 12 2 3 4 5 6 7 8 9 您可以通过以下代码

我的函数中有下面的循环


如果x是的话,我可以看到它是循环的,你应该首先检查你传递给函数的数据类型

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

insert ( 10,   2)
insert (  9,   2)
insert ( '9', '2')
但以下情况并非如此:

这是因为字符串
'10'
实际上小于字符串
'2'
。我的意思是,在排序或比较时,字符串不会被数字处理,而是每个字符都会被单独比较,导致像前12个数字这样的事情被排序为:

1
10
11
12
2
3
4
5
6
7
8
9
您可以通过以下代码(在)看到这一点:

如果您有一个字符串,希望将其视为一个数字,这是一种方法,类似于:

var str42 = '42';
var num42 = parseInt (str42, 10);

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

insert("9", "2")
insert("10", "2")
…而不是

insert(9, 2)
insert(10, 2)
例如,如果您是从html元素属性获取值,那么它们将是字符串

对于字符串,
“2”<“9”
真的
,但
“2”<“10”
假的
-它进行字典顺序比较,而不是数字比较

如果希望函数以任何一种方式工作,则可以将其更改为将字符串转换为数字(我更喜欢使用):

函数插入(x,y){
x=+x;
y=+y;
对于(var shift=y;shift
我不知道whichElementI和insertBeforeI的类型是什么,但将它们转换成*1的数值。这将有助于控制一些算法。可能还需要检查(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

  }
}
函数insertBeforeTo(whichElementI,insertBeforeI){
var twhichElement=块[whichElementI];
块[whichElementI]。动画({x:blocks[insertBeforeI].attr('x')},1000,“>”;
var shiftplusone=insertBeforeI*1;
对于(var shift=insertBeforeI*1;shift”;//检查x值是否实际更改
}
}

输入10,2作为参数时,会发生什么情况?它根本不执行吗?请再发一些代码?尝试控制台日志(shift);查看循环内部发生的情况。对我来说,这两种情况都很好:是的,它不会进入循环,什么类型是
x
y
-看起来它可能使用字典排序(字符串而不是数字),其中
“10”
确实小于
“2”
。你能详细说明一下吗?当我调试它时,我猜它告诉'9'和'10',所以我想我必须正确地转换它。。我仍然不知道9是如何工作的,也不知道10Ajax3.14-字符串是逐字符比较的,所以
'10'
'2'
之前,原因与按字母顺序排列书架时,“aa”在“b”之前相同@FlavorScape:
parseInt()
几乎总是将字符串转换为数字的最差选择,除非您特别希望在字符串末尾使用非数字字符(例如,
parseInt('12abc')
返回
12
)。@FlavorScape yeah明白了。。。nnnnnnnn建议使用一元加号运算符,而且效果很好……除非您特别想捕获错误,如
12abc
,否则parseInt可以将字符串转换为数字。这和你说的有点不同,nnnnnn。将
42abc
乘以
-1
将得到
NaN
-这是否合适是一个高于此问题所在的级别。我的看法是相反的:我需要一种转换方法,我知道该方法对于任何非数字数据都会失败,因为如果我需要一个数字,那么
“12abc”
就是一个错误。我不想要一个能在
“12abc”
上“工作”,但在
“abc12”
上失败的。话虽如此,如果数据来自我无法控制的来源,我会显式验证它。我很乐意使用
parseInt()
作为一种快捷方式来处理合法地将数字后跟非数字的数据,例如像
“12px”
这样的CSS度量值。Javascript函数Numeric(一些变量)也会尝试转换为Numeric类型
10,2 as string: 
9,2 as string: xxxxxxx
9,2 as num: xxxxxxx
10,2 as num: xxxxxxxx
var str42 = '42';
var num42 = parseInt (str42, 10);
insert("9", "2")
insert("10", "2")
insert(9, 2)
insert(10, 2)
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) 
   }       

}
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

  }
}