2011-04-30 70 views
2

我注意到,在我的javascript,如果我創建一個空數組,遍歷它作爲一個關聯數組,並打印出的內容,返回結果是什麼樣子,從數組對象功能課本身。這裏是我的代碼:通過空的JavaScript數組循環返回數組對象的功能

var test = new Array(); 
for(var i in test){ 
    document.write(i + " " + test[i] + "<br>"); 
} 
alert(test.length); // this returns 0 

上面的代碼打印如下(我省略了一些輸出,因爲它是一種長)

$family function(){return u; } 
$constructor function Array() { [native code] } 
pop function pop() { [native code] } 
push function push() { [native code] } 
reverse function reverse() { [native code] } 
shift function shift() { [native code] } 
sort function sort() { [native code] } 
splice function splice() { [native code] } 
unshift function unshift() { [native code] } 
concat function concat() { [native code] } 
join function join() { [native code] } 
slice function slice() { [native code] } 
indexOf function indexOf() { [native code] } 
etc... 

我注意到,如果通過陣列的I循環使用for循環即:

for(var i = 0; i < test.length; i++) 

瀏覽器不會打印出任何東西(這是應該發生的事情)

任何人都可以解釋爲什麼我從一個空數組中獲得一堆函數時,我通過其他方式循環?萬一它很重要,我使用mootools v1.3。提前致謝。

+0

'VAR測試= [];'會更好,而不是使用'新的Array()' – ThiefMaster 2011-04-30 22:34:22

+0

以防萬一,什麼瀏覽器做到這一點? – 2011-04-30 22:59:29

回答

6

擺脫任何擴展Array.prototype的。擴展像ArrayObject這樣的默認類型的原型是不好的,會導致類似的問題。

最簡單的方式來規避問題,同時保持了原型擴展是添加if(!test.hasOwnProperty(i)) continue;檢查。 (obj.hasOwnProperty(key)true如果屬性是對象本身,而不是隻在它的原型鏈某處)

除此之外,遍歷數組時,你不應該使用for..in循環 - 在這種情況下使用for(var i = 0; i < array.length; i++)

+0

這對於數組是關聯的情況非常適用,並且您無法通過鍵循環。謝謝,我今天學到了一些新東西! – Mel 2011-05-01 01:30:55

+0

「關聯數組」是JavaScript中的對象 - 這就是爲什麼擴展Object.prototype也不好。是的,在這種情況下,使用'for..in'是完全正確的,並且在不擴展原型時它實際上沒有問題和附加代碼。 – ThiefMaster 2011-05-01 09:48:29

0

有點遲到了,但我發現這一點的同時試圖找到一種方式來做到這一點。 這就是我想出的。

function createArrayOfEmptyObjects(size) { 
    return Array.apply(0, new Array(size).map(function(){return {};}); 
} 

它將,顧名思義,創建空對象的數組高達所提供的尺寸。