var arr = ['a', 'b', 'c']; var sid = ['Go']; for (var key in arr) { sid[key + 1] = arr[key]; } console.log(sid)
很簡單的問題,最後的輸出結果倒是:node
[ 'Go', , , , , , , , , , , 'b', , , , , , , , , , 'c' ]
經過上面的輸入結果咱們能夠發現這麼幾個問題:數組
sid
裏面多了不少空項,length
明顯的增多了code
arr[0]
的值在sid
中沒有出現對象
sid
裏面多了不少空項,length
明顯的增多了略過痛苦的分析步驟直接來重點內容:
經過打印key + 1
咱們能夠找到問題的關鍵。經過打印咱們能夠獲得以下信息。
在第一次循環的時候key + 1
的值爲01
,此後依次爲:11
,21
。
經過這個咱們能夠判斷: 這個key
實際上是一個String
類型的。
因此上面的步驟至關於:ip
sid['01'] = arr[0]; sid['11'] = arr[1]; sid['21'] = arr[2];
究其緣由,我只能在淺層面做出解釋:
這多是由於for-in
通常是用於對象的(狹義的對象),而對象的屬性是一個String
類型,因此for-in
的參數key
被定義爲一個String
類型。這並無考慮過數組的屬性名(下標)不是String
類型,而是一個Number
類型的狀況。因此就出現了上面的問題。此外在MDN的js語法關於for-in
這塊出現過這樣的提示:get
Note: for..in 不該該被用來迭代一個下標順序很重要的 Array .console
可能就包含這種狀況吧。class
arr[0]
的值在sid
中沒有出現arr[0]
的值其實經過sid['01']
能夠取到。
此外,在node
下打印sid
的時候可能與在console
中打印出現不一樣的結果。循環
對於數組的遍歷,最好使用:forEach
,map
,some
,filter
,find
等方法。尤爲是是這種牽扯到數組下標的儘可能不要使用for-in
來處理,若是非要使用能夠作以下處理:遍歷
var arr = ['a', 'b', 'c']; var sid = ['Go']; for (var key in arr) { sid[parseInt(key) + 1] = arr[key]; } console.log(sid)
以免如上的問題。