2014-01-19 174 views
0
var a = ['a', 'b', 'c']; 

for(var prop in a){ 
    console.log(prop); // '0', '1', '2' 
} 

console.log([] instanceof Object, a['0']); //true, 'a' 

基於上面的代碼,假設創建新數組時,每個索引都設置爲其相應基礎對象上的屬性是正確的嗎?這是指定的地方?Array對象索引屬性

+1

Arrays _are_ objects;沒有「基礎對象」。 – SLaks

+0

@SLaks我認爲他的意思是本機對象。 –

+0

@RoyiNamir:沒有這樣的事情存在。 – SLaks

回答

1

你不應該使用這個構造:

for(var prop in a) 

用於遍歷數組的元素。它迭代對象和所有數組元素的所有可迭代屬性,而不僅僅是數組元素。數組元素應當與任一此樣式被重複:

for (var i = 0; i < a.length; i++) { 
    // a[i] 
} 

或(在現代瀏覽器):

a.forEach(function(value, index) { 
    // use value here 
}); 

陣列也是對象。它可以具有數組元素之外的屬性。所有數組元素都可以像使用字符串鍵的屬性那樣訪問是正確的,但這仍然不是僅迭代數組元素的期望方式。

例如,你可以這樣做:

var a = ['a', 'b', 'c']; 
a.whatever = 3; 

for(var prop in a){ 
    console.log(prop); // '0', '1', '2', 'whatever' 
} 
+0

我知道我不應該這樣做。它似乎沒有迭代實際的_elements_,而是添加到對象的屬性。要訪問實際的元素,我必須做一些像'a [prop]',而不是'prop'的東西。由於'Array'是一個'Object',我想知道在創建新數組時是否可以安全地將這些屬性添加到對象本身? – Johan

+0

@Johan - 假設可以使用屬性表示法訪問數組元素,並且'for ... in'表示法將包含數組元素(除了屬性),這是安全的。但是,它是一個數組元素。沒有「屬性」被添加到對象perse。這是一個數組元素,並且存在細微差別 - 它們不是同一件事。例如,'.length'中只包含數組元素。 – jfriend00

+0

如果沒有添加任何屬性,那我爲什麼要訪問'a ['0']',它本質上與'a.0'相同(顯然不能編譯)? – Johan

0

for(... in ...)用於循環對象的屬性和方法。

對於像你使用的數組,你想要使用經典的(i = 0; i <長度; i ++)。

1

是的,我相信這是規範的一部分:數組是一個對象,它的名字是性能指標轉換爲字符串。這有點醜。

+0

同意。感謝您回答實際問題。 – Johan