关闭

JavaScript for...in 循环的陷阱

213人阅读 评论(0) 收藏 举报

最近有好几次用到for...in循环的时候都遇到了错误,循环的索引总是会指向一些不应该被指向的元素。之前都是换用普通的for循环来修改。今天在网上搜索了一些关于for...in的博文,发现了问题的所在。转载如下:


原文地址:http://www.mangguo.org/javascript-for-in-loop-trap/

For…In 声明用于遍历数组或者对象的属性(对数组或者对象的属性进行循环操作)。

先定义一个构造函数:

[javascript] view plaincopy
  1. var Status = function(arg){  
  2.     this.arg = arg;  
  3. }  
  4. Status.prototype.getStatus = function(){  
  5.     return this.arg;  
  6. }  

接着实例化:

[javascript] view plaincopy
  1. var instance = new Status('a test string');  
  2. instance.getStatus();  
  3. instance.ooxx = 'ooxx';  

用 for…in 遍历属性:

[javascript] view plaincopy
  1. for(i in instance){  
  2.     console.log(i);  
  3. }  

看下运行结果:

arg

ooxx

getStatus

可见原型方法也被遍历出来的,但事实上往往并不想要。于是需要这么干:

[javascript] view plaincopy
  1. for(i in object){  
  2.     if(object.hasOwenProperty(i)){  
  3.         //...  
  4.     }  
  5. }  

这样就能把函数和原型属性方法过滤掉鸟~
参考:《JavaScript 语言精粹》第 120 页,饺子哥威武


学习心得:

在进一步的试验中,我发现for...in循环遍历的元素包括数组的元素以及对象的成员(也就是对象中this关键字后跟的属性和方法),以及通过prototype关键字添加给数组或者对象的属性和方法。也就是说,for...in循环中的索引项不仅仅是基本的数字索引,还会包含其他一些意料之外的索引项(对象的属性名、方法名,prototype添加的方法名等)。因此,在数组或者对象的成分比较复杂的情况下,使用普通的for循环将会更加安全。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:904413次
    • 积分:10605
    • 等级:
    • 排名:第1543名
    • 原创:92篇
    • 转载:1171篇
    • 译文:11篇
    • 评论:28条
    最新评论