2012-06-26 76 views
-2

我在我的功能有下面這樣循環奇怪的Javascript功能迴路行爲

我看到它遍歷如果x < 10,但如果它是大於10失敗,即使Ÿ< 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 

    } 
} 

向下投票者:介意解釋?

發現問題:在調試時,我看到了''中的哪個ElementI和insertBeforeI值。所以我認爲它把它當作一個字符串,正如nnnnn和paxdiablo正確指出的那樣,它需要字符串而不是int,所以它適用於哪個ElementI = 9和insertBeforeI = 2,而不是whereElementI = 10,insertBeforeI = 2。

所以我使用+ whichElementI,+ insertBeforeI修正了這個問題。

感謝

+0

當您輸入10,2作爲參數時會發生什麼?它根本不執行嗎? –

+3

請多發一些代碼?試試console.log(shift);看看循環內部發生了什麼。 – Meryovi

+0

在這兩種情況下都適用於我:http://jsfiddle.net/rxDXG/2/ –

回答

1

我猜你無意中調用帶有字符串值,而不是數值的功能,即與

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

...而不是

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

如果從HTML元素讓你的屬性值,例如,他們將字符串秒。

隨着"2" < "9"true,但"2" < "10"false - 它確實詞典(字典)爲了進行比較,而不是一個數值比較。

如果你想你的函數的工作無論哪種方式,那麼你可以將其更改爲字符串轉換爲數字(我更喜歡使用unary plus operator用於這一目的):

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) 
    }  

} 
+0

太棒了它現在正常工作!謝謝 –

1

你應該首先檢查你傳遞給函數的數據類型。

例如,所有這些產生輸出:

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 

你可以看到這用下面的代碼動作(在one of the many on-line JS runners):

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); 
+0

可以請你詳細說明當我調試它告訴'9'和'10'時,我有點猜到了這一點,所以我想我必須把它正確..我仍然沒有得到9如何工作,而不是10 –

+2

不鑄造,parseInt( ) – FlavorScape

+1

Ajax3.14 - 字符串按字符進行比較,所以''10''在'2'之前出現,原因與「aa」在「b」之前出現的原因相同, FlavorScape:'parseInt()'幾乎總是把字符串轉換爲數字的最糟糕的選擇,除非你特別希望在末尾有非數字字符的字符串工作(例如,'parseInt('12abc')'''12 ')。 – nnnnnn

1

我不知道是什麼類型的其中ElementI和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 

    } 
} 
+1

JavaScript函數Numeric(some_var)也將嘗試轉換爲數字類型 – MMeah