用for-in循环遍历非数组对象时一些值得注意的现象(hasOwnProperty的使用)
2012-10-28 18:23
423 查看
对于非数组对象,遍历方法似乎只有使用for-in循环,但是使用for-in会遍历出一些意料之外的东西,请看下面这些现象:
所以个人强烈反对对原生Object、Function等的prototype进行扩展!
Object.cre = 'Obj.cre'; Object.prototype.abc = 'Obj-abc'; Object.prototype.bcd = 'Obj-bcd'; Function.prototype.abc = 'Fn-abc'; Function.prototype.bcd = 'Fn-bcd'; Function.prototype.test = 'Fn-test'; var k, o = {}, f = function(){}; f.prototype.abc = 'f-abc'; f.prototype.cde = 'f-cde'; f.test = 'f.test'; for(k in o){ alert(o[k]); //依次弹出Obj-abc、Obj-bcd //o.hasOwnProperty(k) && alert(o[k]); //无弹出 } alert('br1'); for(k in f){ alert(f[k]); //依次弹出f.test、Fn-abc、Fn-bcd //f.hasOwnProperty(k) && alert(f[k]); //弹出f.test } var fp = f.prototype; alert('br2'); for(k in fp){ alert(fp[k]); //依次弹出f-abc、f-cde、Obj-bcd //fp.hasOwnProperty(k) && alert(fp[k]); //依次弹出f-abc、f-cde }所以,为了保证遍历结果在我们的预期之内,for-in一定要使用hasOwnProperty进行判断,而对于数组遍历一定不要使用for-in。
所以个人强烈反对对原生Object、Function等的prototype进行扩展!
相关文章推荐
- Effective JavaScript Item 49 对于数组遍历,优先使用for循环,而不是for..in循环
- JavaScript-//FOR/IN循环。当使用for/in循环遍历关联数组时,就可以清晰地体会到for/in的强大之处。
- Effective JavaScript Item 49 对于数组遍历,优先使用for循环,而不是for..in循环
- 使用hasOwnProperty()方法来为for-in循环过滤出实例属性
- js中的循环遍历数组中的元素,ES6(for-of)、ES5(forEach、for-in)、通用(for(i=0;i<length;i++))
- for/in 循环遍历对象的属性
- ie中for...in...循环不能遍历对象数组
- js循环遍历的两种方法for循环和for ... in 循环
- javascript中for/in循环及使用技巧
- Python(5)使用for...in循环和列表推导式打印一个99乘法表
- javascript中for/in循环及使用技巧
- js数组遍历 千万不要使用for...in...
- 使用for循环经典案例输出空心的菱形 in Java
- 对自定义对象 使用for..in 的遍历
- 复习 使用for、while循环遍历文件,数据类型转换
- javascript中for/in循环介绍及使用技巧
- Java5的for/in循环使用
- [Effective JavaScript 笔记]第49条:数组迭代要优先使用for循环而不是for...in循环
- 嵌套 JSON 对象中的数组使用 for-in 来循环访问每个数组