2012-11-27 22 views
4

我連接的一個API讓我返回一個對象。它的一個鍵/屬性被稱爲「長」,這引發了一些奇怪的行爲:js/jquery:使用名爲「length」的對象鍵問題

var obj = {"text1":{"index":0,"lengt":5}}; //modified key for testing 

$.each(obj.text1,function(k,v){  
    console.log ('i: '+k+' v: '+v); }); 

i: index v: 0 //this is the result I'm looking for 
i: lengt v: 5 

var obj = {"text1":{"index":0,"length":5}}; //original object 

i: 0 v: undefined // ???? 
i: 1 v: undefined 
i: 2 v: undefined 
i: 3 v: undefined 
i: 4 v: undefined 

我認爲length是一個保留字,但是這是原來的對象是怎麼來。找出並解決此問題的最佳方法是什麼?

非常感謝您的任何幫助。

+2

在調試代碼時,使用描述性變量名稱會更有幫助(例如key/val for k/v)。另外,不是傳遞'log()'一個字符串,而是發送很多參數(用','-commas替換'+') – vol7ron

+1

_「我假設長度是保留字」_ - 您可以使用保留字作爲屬性名。迭代使用[vanilla JS](http://vanilla-js.com/)'for..in'循環代替jQuery,它可以正常工作。 – nnnnnn

+0

謝謝你的投入。 – Henry

回答

4

這是一個jQuery「功能」;-)。據該人士透露它把一個變量作爲對象,如果沒有定義length屬性:

https://github.com/jquery/jquery/blob/master/src/core.js#L589

var name, 
    i = 0, 
    length = obj.length, 
    isObj = length === undefined || jQuery.isFunction(obj); 
     ^--------- 

如果isObjfalse - 再看看https://github.com/jquery/jquery/blob/master/src/core.js#L608

if (isObj) { 
    // not your case, ommitted 
} else { 
    for (; i < length;) { 
     if (callback.call(obj[ i ], i, obj[ i++ ]) === false) { 
      break; 
     } 
    } 
} 

,你可以看它迭代i0length

+0

這告訴我,jQuery並非沒有警告。會回到一個普通的JS循環。謝謝! – Henry

1

爲什麼不使用普通的舊式「for-in」結構?有時候只需要jQuery ...這更直接,更優化:沒有函數調用,沒有用「if isObj thing」的測試,它可能是2或3行代碼...

var value; 
for (var key in object) 
{ 
    value = object[key]; 
    console.log(key, '=', value); //and voila ! 
} 
+0

走這條路。謝謝 – Henry