2012-04-30 20 views
1

我有一段循環訪問表單元素並構建對象的JavaScript代碼。 我有一個混合的HTML輸入字段和ASP.NET輸入字段。 ASP.NET將字段的ID更改爲xxxxx_yyyy_id形式,所以我試圖使用split函數來提取原始ID。使用javascript array.length函數的奇怪結果

// Iterate over all the text fields and build an object 
$(':text').each(function() { 

    var tokens = this.id.split("_"); 
    if (tokens.length = 3) { 
     // Assume this is a .net inputbox - extract the original id 
     inFormData[tokens[2]] = this.value; 
    } else {    
     inFormData[this.id] = this.value; 
    } 
}); 

通過上述代碼步進,所述第一ID是ctl00_ContentPlaceHolderCol1_forenameField,所以tokens.length = 3代碼運行。 在第二次迭代中,id是forenameField2,所以我期望tokens.length是1,但實際上是3. else語句永遠不會運行。

這可能是簡單的,但我無法解決它。如果我檢查令牌數組,它在第二次迭代中只有1個元素。我也試過在每次迭代之後將array.length設置爲0。

任何幫助表示讚賞。

+0

'='是賦值 - 你的意思''==(甚至更好''===) – Alnitak

回答

5

糾正這一點,

== instead of =. === is more better 


    if (tokens.length == 3) { 
     // Assume this is a .net inputbox - extract the original id 
     inFormData[tokens[2]] = this.value; 
    } else {    
     inFormData[this.id] = this.value; 
    } 
+0

@Alnitak感謝 – thecodeparadox

+0

有人建議使用在左邊的常量'(3 == tokens.length)',因爲如果你忘記了一個'='它會變成一個編譯錯誤。我不喜歡它,但它有一點。 –

+0

太棒了,它的確有竅門。 – StevenC

1

來自:

if (tokens.length = 3) { 

到:

if (tokens.length == 3) { 
2

更改= 3=== 3

在你overwri的那一刻每次都打tokens.length

NB:===最好==,因爲它是一個確切平等檢查。兩個等號的版本將嘗試在比較之前將兩個操作數強制轉換爲相同的類型,這是1.不必要的,2.效率低下,3.有時容易出錯。

2

這就是爲什麼測試時應始終首先保持恆定的原因。如果你忘記了一個比較簽名會引發錯誤:

if(3 = tokens.length) // throws an error 
if(3 == tokens.length) // ok 
if(3 === tokens.length) // ok