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)
以免如上的问题。