和 in 操作符一样,for in 循环同样在查找对象属性时遍历原型链上的所有属性。

注意: for in 循环不会遍历那些 enumerable 设置为false 的属性;比如数组的length 属性。

// 修改 Object.prototype
Object.prototype.bar = 1;var foo = {moo: 2};
for(var i in foo) {console.log(i); // 输出两个属性:bar 和 moo
}

由于不可能改变 for in 自身的行为,因此有必要过滤出那些不希望出现在循环体中的属性, 这可以通过 Object.prototype 原型上的 hasOwnProperty 函数来完成。

注意: 由于 for in 总是要遍历整个原型链,因此如果一个对象的继承层次太深的话会影响性能。

使用 hasOwnProperty 过滤

// foo 变量是上例中的
for(var i in foo) {if (foo.hasOwnProperty(i)) {console.log(i);}
}

这个版本的代码是唯一正确的写法。由于我们使用了 hasOwnProperty,所以这次输出 moo。 如果不使用 hasOwnProperty,则这段代码在原生对象原型(比如 Object.prototype)被扩展时可能会出错。

一个广泛使用的类库 Prototype 就扩展了原生的 JavaScript 对象。 因此,当这个类库被包含在页面中时,不使用 hasOwnProperty 过滤的 for in 循环难免会出问题。

总结

推荐总是使用 hasOwnProperty。不要对代码运行的环境做任何假设,不要假设原生对象是否已经被扩展了。

转载于:https://www.cnblogs.com/luckyxb/p/6398503.html

对象④for in 循环相关推荐

  1. 防止NSTimer和调用对象之间的循环引用

    防止NSTimer和调用对象之间的循环引用 @interface NSTimer (EOCBlocksSupport)+ (NSTimer *)eoc_scheduledTimerWithTimeIn ...

  2. 小程序循环不同的组建_小程序之八,对象数组、循环及条件渲染

    富力丹麦小镇P20-602的春天 一.对象数组 很多情况下,我们需要多次显示同一个条目(item),或者说是某个类的不同实例对象.类似如下: 那么,你可以写很复杂的WXML,"手工" ...

  3. php数组循环转为对象,php中循环实现(字符串,对象,或者数组)编码相互转换

    /** * 循环实现编码互转 * * @param string $param(字符串,对象,或者数组),$currCharset当前编码,$toCharset期望编码 * @return 参数类型 ...

  4. js对象赋值、循环对象

    一般我们给对象的属性赋值时这样的: let a={}; a.value="值"; 如果在一个循环中,循环去给对象赋值的话,就会覆盖掉前面的值,而又想每次循环赋值的属性都不一样的话, ...

  5. 如何在html页面遍历对象,javascript如何循环遍历对象?

    在JavaScript中有多种循环遍历对象的方法,下面本篇文章就来给大家介绍一下使用JavaScript循环遍历对象的方法,希望对大家有所帮助. 1.使用for 循环 for 循环是 Js 中最常用的 ...

  6. 循环数组对象 php,PHP循环遍历stdClass对象的数组

    我有一个在MySQL中运行的查询,它返回一个结果作为stdClass对象,如下所示: array(8){ [ 0 ]=>object(stdClass)#36(1){ [ "color ...

  7. 浅析 SpringMVC 中返回对象的循环引用问题

    问题发现 今天这个话题还是比较轻松的,可能很多朋友也都遇到过这个问题. @RestController.@ResponseBody 等注解是我们在写 Web 应用时打交道最多的注解了,我们经常有这样的 ...

  8. Python快速学习10: 循环的对象及设计 (生活的规律)

    正文 循环对象的并不是随着Python的诞生就存在的,但它的发展迅速,特别是Python 3x的时代,循环对象正在成为循环的标准形式. 灵活的循环方式 (我晚饭后爱上了萨克斯,因为这是生活的一部分.属 ...

  9. Python进阶06 循环对象与迭代

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 这一讲的主要目的是为了大家在读Python程序的时候对循环对象有一个基本概念. 循 ...

最新文章

  1. PL/SQL 游标
  2. 字符集:ASCII、GB2312、GBK、GB18030、Unicode
  3. python连接spark_python如何通过pyspark的API操作spark
  4. 深入理解Spark 2.1 Core (六):Standalone模式运行的原理与源码分析
  5. 《WinForm开发系列之控件篇》Item31 MenuStrip(暂无)
  6. 计算机视觉基础:图像处理 Task 03 - 颜色空间互转
  7. THUWC2019游记
  8. 题目1555:重复子串
  9. 人脸识别(三) 摄像头中的人脸识别+LFW数据集测试
  10. MIPI学习--CSI2
  11. Python 进行debug的错误most likely due to a circular import
  12. 3-增量序列{3,2,1}的希尔排序时间复杂度分析
  13. discuz X2数据字典
  14. SPSS纵向数据格式转换为横向数据格式时变量不是自己想要
  15. Oracle EBS WIP关闭失败提示:这些任务存在待定事务处理
  16. 怎么利用群控解决问题
  17. 基于微波光子I/Q去斜接受的雷达系统
  18. 电子元器件图片、名称、符号,超全面+唯样商城
  19. webpack5使用souceMap和watchMode搭建简易开发环境
  20. 3DMax—吹风机建模

热门文章

  1. 生成从A到Z这个一个字符序列
  2. 摘抄--apache工作模式详解
  3. [linux基础学习]文件和目录属性
  4. ASA 独立实现WEB URL过滤!!!
  5. ArrayList的序列化
  6. PAT甲级1001.A+B Format(20)
  7. 全局变量:global与$GLOBALS的区别和使用
  8. 伪代码的写法(转载)
  9. 杀毒软件原理后续阶段
  10. ServiceModel 元数据实用工具 (Svcutil.exe)