js是一门动态语言,而且是弱类型的,这也引来了一些不必要的麻烦,比如说数组的长度不固定,数组也可以像其他语言里的对象一样给它添加属性看下面的例子
var arr = [1,2,3] arr.name = '李世明' for(var i = 0 , len = arr.length ; i<len ; i++){ console.log(arr[i]) } console.log('数组长度:'len)
上面是正常的使用常规的for循环语句,还有一个用来循环对象的for(var key in obj),假如使用for in以上的arr会出现什么样的结果呢?它会循环4次,没错就是这么怪异,下面来解析一下为什么会这样,解释的不对的话小伙伴们多多指教,下面只是我个人的理解,或许不对
数组本身也是个由键值对组成的,在普通的数组中(没有给数组追加任何属性的情况下比如上面的name属性),验证这点可以使用console.log(arr)和console.dir(arr)验证查看
所以name作为arr的一个用for in显然就会被迭代到,因为他枚举的是键值对,在这个arr的数组中可枚举的属性就4个,看代码
所以在循环数组时应该尽量避开for in 以免发生不必要的麻烦
当然了在ES 2015中可以用for of来替代for in,for of修复了这个bug