2013-12-10 76 views
0

我來自python背景的javascript,想問如何解釋我看到的一些代碼。Python vs javascript lists

在Python,我可以得到下面的代碼/輸出:

Python代碼:

myarray = ["a","b", "c"] 
for item in myarray: 
    print (item) 

Python的輸出

a 
b 
c 

在Javascript中,這給了我的東西不同:

JavaScript代碼:

var myarray = ["a","b","c"] 
for(var item in myarray){ 
    console.log(item) 
} 

的Javascript輸出:

"0" 
"1" 
"2" 

正是這種解釋是交代不清的我。在python中,for循環會自動讀取「myarray中的每個項目,打印項目」。但是在Javascript版本中,它打印出「0」,「1」,「2」。爲了得到它正確, 我需要改變的代碼是:

var myarray = ["a","b","c"] 
for(var item in myarray){ 
    console.log(myarray[item]) 
} 

我想問這是什麼邏輯背後是(至少對我來說,這似乎不是那樣清晰不)?另外,爲什麼我的第一種方式將項目打印爲字符串?

謝謝你的幫助!

+1

不同的語言操作方式不同,有時您需要閱讀文檔以瞭解方法和原因。 **這裏有什麼問題?** – 2013-12-10 04:03:38

+0

可能的重複[在JavaScript中循環數組](http://stackoverflow.com/questions/3010840/loop-through-array-in-javascript) – John

+0

[此問題]( http://stackoverflow.com/questions/3010840/loop-through-array-in-javascript)可能有用 – goncalopp

回答

3

您的JavaScript代碼顯示了一種迭代應該很少使用的數組的方法。您應該使用for聲明。

var myarray = ["a","b","c"] 
for(var i = 0; i < myarray.length; i++){ 
    console.log(i, myarray[i]) 
} 

原因是for-in是一個普通的屬性枚舉器。它包含對象的所有屬性,包括擁有和繼承的屬性,不受數字索引的限制。因此,它將包含您可能包含的所有擁有或無意枚舉的屬性。

此外,for-in不保證枚舉的順序。因此,你不能確定你會得到一個期望的升序。


JavaScript中對象的所有鍵都是字符串,而數組只是另一種類型的對象。這就是爲什麼for-in爲您提供字符串的鍵,這就是爲什麼for-in工作在陣列上。

通常情況下,for-in將被用於對象,如:

var myobject = { 
    foo: "bar", 
    baz: "buz" 
} 

for (var p in myobject) { 
    console.log(p, myobject[p]); 
} 

所以,是的,它「作品」,在這個意義上,for-in語句不拒絕Array對象。但是,如果目標是以可預測的順序迭代數字指數,那麼for-in就不是正確的工具。


如果你用優雅的語法之後是簡單的,ECMAScript的5補充說,接受被調用爲每個現有成員回調函數數陣迭代方法。

.forEach()方法就是一個例子。

myarray.forEach(function(item, i) { 
    console.log(item, i); 
}); 
+0

爲什麼?我完全理解爲什麼我可以用for user1357015

+1

這就是JavaScript的語義。 –

+1

對於Array而言+1是一個對象 – srquinn

0

A for for ... in循環不會遍歷非可枚舉的屬性。從Array和Object等內置構造函數創建的對象繼承了Object.prototype和String.prototype中不可枚舉的非枚舉屬性,如String的indexOf方法或Object的toString方法。循環將迭代對象本身的所有可枚舉屬性,而對象則繼承其構造函數的原型(更接近原型鏈中的對象覆蓋原型的屬性)。

A for ... in循環以任意順序迭代對象的屬性(有關更多信息,請參閱delete操作符,爲什麼不能依賴迭代的看似有序性,至少在跨瀏覽器設置中) 。如果一個屬性在一次迭代中被修改,然後在稍後訪問,那麼它在循環中的值就是它以後的值。在被訪問之前被刪除的屬性將不會在稍後訪問。添加到發生迭代的對象的屬性可以被訪問或從迭代中省略。通常最好不要在迭代過程中添加,修改或刪除對象中的屬性,而不是當前正在訪問的屬性。無法保證是否會訪問添加的屬性,修改的屬性(除當前的屬性之外)是在修改之前還是之後訪問,或者在刪除之前是否訪問刪除的屬性。

0

試試這個 - :

for(item in myarray){ 
    console.log(myarray[item]) 
} 

item將獲得myarray指數。