2012-04-30 19 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