为什么遍历数组元素最好使用for而不是for-in

JavaScript 2014-01-19 数组,for,for-in,遍历

在JavaScript中,严格来说所有的数据类型鼻祖都是Object,所以我们来看看以下这个例子:

>>> var arr = ["a", "b", "c"];
undefined
>>> for(var i=0; i<arr.length; i++){ console.log(i); }
0
1
2
>>> for(var i in arr){ console.log(i); }
0
1
2

以上例子定义了一个包含3个元素的数组arr,然后分别使用for和for-in来遍历它的元素,结果都没问题。但如果我给arr添加一个原型方法,结果就不一样了。

>>> Array.prototype.len = function(){ return this.length; };
function()
>>> arr.len()
3

给数组原型添加了一个自定义len方法,然后再使用for和for-in来遍历它

>>> for(var i=0; i<arr.length; i++){ console.log(i); }
0
1
2
>>> for(var i in arr){ console.log(i); }
0
1
2
len

for循环没问题,但for-in却把我们自定义的len方法也给遍历出来了,可是arr.length还是等于3。这说明for-in会把Array当做一个Object来遍历所有成员包含Array的元素,len做为arr的成员自然也就被遍历出来。

然后有人就说,那我不给数组添加原型方法,那用for-in就没问题,可是你又敢保证有人不这么干吗?

>>> var arr = [];
undefined
>>> arr.id = Date.now()
1390099868440

包括String类型同样使用for-in要注意,看下面例子:

>>> var str = "qttc";
undefined
>>> String.prototype.lastChar = function(){ return this.charAt(this.length-1) }
function()
>>> str.lastChar()
"c"
>>> str.length
4
>>> for(var i=0; i<str.length; i++){ console.log(i); }
0
1
2
3
>>> for(var i in str){ console.log(i); }
0
1
2
3
lastChar

这个例子很好的说明了for与for-in的区别,所以反过来你想要知道某个String或者Array或者任意类型的对象被添加了什么方法都可以使用for-in获得,for-in是最彻底的。

文字链接:《为什么遍历数组元素最好使用for而不是for-in

文章地址:http://www.qttc.net/201401405.html

除非标注,琼台博客所有博文均为原创,转载请加文字链接注明来源

乳名?小名?昵称?网名?均可

email,放心,我不会给你乱投广告的

想获得回访就把你的站点URL写上(没有留空)

[NOTICE]木要投放广告
[NOTICE]木要骂人,说不该说的话
[NOTICE]自由言论,但要遵纪守法

Comments 1

  • 在使用 for-in 循环的时候,返回的是所有能通过对象访问的、可枚举的属性。如果该属性的可枚举属性设置为了 false 就没法枚举了。《JavaScript 高级程序设计》 P 152 ,最近刚看的~
    2014-02-15 17:39:13 [ 跟帖 ]
    1 #