2014-11-08 81 views
0

我一直很驚訝的是,在Javascript:爲什麼數組中的var返回一個字符串索引?

> vals = ["a", "b", "c"] 
> for (v in vals) console.log(v + 1) 
01 
11 
21 

這是因爲:

> for (v in vals) console.log(typeof(v)) 
string 
string 
string 

,所以我不得不做這樣的事情:

> for (v in vals) console.log(parseInt(v) + 1) 
1 
2 
3 

爲什麼這個發生?

我知道我可以做

> for (var v = 0; v < vals.length; v++) console.log(v + 1) 
1 
2 
3 

,但使用與Python我的腦海裏設置有for ... in ...迭代

+2

*「...但是與python一起使用我的思維是用'for ... in ...'iteration」設置的* Python在這裏是無關緊要的。這是JavaScript。所有對象屬性都是字符串。使用'for'循環。 – 2014-11-08 17:10:56

+0

...... JS中有幾個原因讓我們用'for'代替數組中的'for-in'。然而,如果你真的想這樣做,你可以縮短它到'console.log(+ v + 1);' – 2014-11-08 17:14:42

回答

3

我的朋友,不料原型繼承的奇蹟和詛咒。你正在迭代for..in不是一個數組。您正在遍歷一個Array對象。看看文檔:

數組索引只是具有整數名稱的可枚舉屬性, 在其他方面與通用對象屬性相同。沒有 保證for ... in將返回任何特定 訂單中的索引,並且它將返回所有可枚舉的屬性,包括具有非整數名稱的 以及那些被繼承的屬性。

由於迭代的順序與實現有關,因此在數組上迭代 可能無法以一致的順序訪問元素。因此, 最好在對數組訪問順序爲 的數組進行迭代時使用帶有數字索引(或Array.forEach 或for ... of循環)的for循環。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in

所以你面對的是在Array對象枚舉「整數名」性質的,而不是數字順序。

編輯for v in array在JavaScript中不等於在Python中的for v in list。它相當於for k, v in dict.iteritems(),但是作爲一個帶整數名字的字符串,也就是「1」,「2」,「3」等,它隱含給你。我認爲它從OO角度來看也是違反直覺的。一個列表/數組如何成爲一個類似於字典的對象?但是從原型的角度來看,只要有從Object.prototype繼承的任何東西,它就可以被認爲是一個帶有鍵和屬性的對象。

+0

非常感謝你,這真的解釋了。 – neurino 2014-11-09 10:45:04

相關問題