for in 语句用来列举对象的属性(成员),如下
var obj = { name:"jack", getName:function(){return this.name} }; //输出name,getName for(var atr in obj) { alert(atr); }
注意了吗,没有输出obj的toString,valueOf等内置属性(或称内置成员,隐藏属性和预定义属性)。即for in用来列举对象的显示成员(自定义成员)。
如果重写了内置属性呢,下面就重写obj的toString
var obj = {name:"jack", getName:function(){return this.name}, toString:function(){return "I'm jack."} } for(var atr in obj) { alert(atr); }
会输出什么呢?
1.IE6/7/8 下和没有重写toString一样,仍然只输出name,getName
2.IE9/Firefox/Chrome/Opera/Safari下则输出name,getName,toString
如果给内置原型添加属性/方法,那么for in时也是可遍历的
Object.prototype.clone = function() {} var obj = { name: 'jack', age: 33 } // name, age, clone for (var n in obj) { alert(n) }
给Object.prototype添加了方法clone,for in时所有浏览器都显示了clone。
这或许还没什么,因为一般不建议去扩展内置构造器的原型,这也是Prototype.js走向没落的原因之一。jQuery和Underscore没有扩展自原型,前者在jQuery对象上做文章,后者索性将所有方法都挂在下划线上。
但有时我们为了兼容ES5或后续版本,会在不支持ES5的浏览器上(IE6/7/8)去扩展内置构造器的原型,这时for in在各浏览器中就不同了。如下
if (!Function.prototype.bind) { Function.prototype.bind = function(scope) { var fn = this return function () { fn.apply(scope, arguments) } } } function greet(name) { alert(this.greet + ', ' + name) } for (var n in greet) { alert(n) }
IE6/7/8输出了bind,其它浏览器则无。因为现代浏览器中bind是原生支持的,for in不到,IE6/7/8则是给Function.prototype添加了bind。
总结下:在跨浏览器的设计中,我们不能依赖于for in来获取对象的成员名称,一般使用hasOwnProperty来判断下。
文章来源:http://www.cnblogs.com/snandy/archive/2011/03/03/1970132.html
相关推荐
然而,`for...in`循环在实际应用中存在一些潜在的问题和缺陷,这些缺陷主要体现在以下几个方面: 1. **遍历顺序不固定**:`for...in`循环遍历对象属性时,并不保证属性的遍历顺序,这意味着在不同环境下,相同的...
在介绍这些缺陷之前,我们首先要了解for in循环的基本用法和目的。for in循环会遍历对象的所有可枚举属性,并将每个属性名(键)赋值给循环变量,供循环体内部使用。 然而,for in循环有其局限性。首先,它不仅会...
JavaScript中的`for...in`循环是用来迭代对象的所有可枚举属性,包括那些从原型链继承而来的属性。然而,这个语法结构存在一些显著的缺陷,这些缺陷在处理不同浏览器和JavaScript环境时尤其需要注意。 首先,`for.....
《MISRA C:2012 Guidelines for the use of the C language in critical systems》是MIRA Limited出版的一本关于C语言在关键系统中使用的指南,适用于汽车工业和其他对软件可靠性有极高要求的领域。MISRA(Motor ...
使用趋动云平台复现论文源码IM-IAD: Industrial Image Anomaly Detection Benchmark in Manufacturing主要针对工业领域CV方向异常检测现阶段最先进的方法,构建一套统一开源框架便于后续研究者开发与使用,本文主要...
《基于Yolov8实现热轧带钢表面缺陷检测的深度学习实践》 在现代工业生产中,确保产品质量是至关重要的。特别是在钢铁制造领域,热轧带钢的表面缺陷检测是一项关键技术,它能够及时发现并避免产品质量问题,提高生产...
MISRA C规则的目的是减少缺陷的发生,并促进代码的可读性、一致性和可维护性。例如,MISRA C规则要求使用const来保护那些不应该被改变的值,限制使用宏、避免不安全的函数,以及禁止使用动态内存分配等。这些规则...
在IT行业中,尤其是在科学计算和工程模拟领域,Hashin失效准则和VUMAT(User-Defined Material subroutine for Nonlinear Analysis in ABAQUS)是两个非常重要的概念。这两个概念主要应用于复合材料、土木工程等领域...
类似地,Sunghyo Kim的文章“Crashed Software: Assessing Product Liability for Software Defects in Automated Vehicles”分析了在自动驾驶汽车中,软件缺陷如何被认定为产品责任。 此外,文章还提到了欧洲共同...
R6程序的评估重点是组件中缺陷的裂纹起始能力,早期的版本由于对奥氏体材料应变硬化能力的不适应性,在进行缺陷评估时显得不适当。第三版R6修订通过允许引入材料的特有性质,拓宽了它的适用范围,使其适用于包括...
在本文中,我们将详细分析 "for all entries" 语句的缺陷,及其对性能的影响。 首先,让我们来看一下 "for all entries" 语句的基本用法。例如,我们有一个表 MARA,包含了物料的信息,我们想从这个表中选取出某些...
遵循MISRA C 2012规范的开发过程可以显著降低软件缺陷率,提高代码质量,使得软件在关键系统中的运行更加安全可靠。然而,由于这些规则严格且详细,实施起来可能会增加开发成本和复杂性,因此需要权衡项目的需求和...
### 《BDD IN ACTION:Behavior-Driven Development for the whole software lifecycle》 #### 行为驱动开发(Behavior-Driven Development, BDD)简介 行为驱动开发(BDD)是一种敏捷软件开发方法,它强调在整个...
Surface defect detection plays a key role in controlling the quality during manufacturing process for strip steel. However, traditional defect detection of strip steel in industry is still performed ...
steel surface defect recognition is an important task in industrial production, and traditional image processing methods have limitations in terms of accuracy and real-time monitoring. This paper ...
Product defects are costly for businesses and can lead to financial and consumer health issues. The current dataset contains 168 image files with a total of 1859 jar lids, on average 11 per image. ...