`

for in的缺陷

阅读更多

        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

分享到:
评论

相关推荐

    关于js中for in的缺陷浅析.docx

    然而,`for...in`循环在实际应用中存在一些潜在的问题和缺陷,这些缺陷主要体现在以下几个方面: 1. **遍历顺序不固定**:`for...in`循环遍历对象属性时,并不保证属性的遍历顺序,这意味着在不同环境下,相同的...

    关于js中for in的缺陷浅析

    在介绍这些缺陷之前,我们首先要了解for in循环的基本用法和目的。for in循环会遍历对象的所有可枚举属性,并将每个属性名(键)赋值给循环变量,供循环体内部使用。 然而,for in循环有其局限性。首先,它不仅会...

    Javascript for in的缺陷总结

    JavaScript中的`for...in`循环是用来迭代对象的所有可枚举属性,包括那些从原型链继承而来的属性。然而,这个语法结构存在一些显著的缺陷,这些缺陷在处理不同浏览器和JavaScript环境时尤其需要注意。 首先,`for.....

    MISRA C_2012 Guidelines for the use of the C language in critical systems.pdf

    《MISRA C:2012 Guidelines for the use of the C language in critical systems》是MIRA Limited出版的一本关于C语言在关键系统中使用的指南,适用于汽车工业和其他对软件可靠性有极高要求的领域。MISRA(Motor ...

    深度学习IM-IAD工业图像缺陷检测框架学习

    使用趋动云平台复现论文源码IM-IAD: Industrial Image Anomaly Detection Benchmark in Manufacturing主要针对工业领域CV方向异常检测现阶段最先进的方法,构建一套统一开源框架便于后续研究者开发与使用,本文主要...

    基于yolov8实现热轧带钢表面缺陷检测源码+数据集+详细使用教程.zip

    《基于Yolov8实现热轧带钢表面缺陷检测的深度学习实践》 在现代工业生产中,确保产品质量是至关重要的。特别是在钢铁制造领域,热轧带钢的表面缺陷检测是一项关键技术,它能够及时发现并避免产品质量问题,提高生产...

    MISRA C2012 Guidelines for the use of the C language in critical systems.pdf

    MISRA C规则的目的是减少缺陷的发生,并促进代码的可读性、一致性和可维护性。例如,MISRA C规则要求使用const来保护那些不应该被改变的值,限制使用宏、避免不安全的函数,以及禁止使用动态内存分配等。这些规则...

    hashin失效vumat,hashin失效准则介绍,Fortran

    在IT行业中,尤其是在科学计算和工程模拟领域,Hashin失效准则和VUMAT(User-Defined Material subroutine for Nonlinear Analysis in ABAQUS)是两个非常重要的概念。这两个概念主要应用于复合材料、土木工程等领域...

    自动驾驶汽车的缺陷及其产品责任-王乐兵.pdf

    类似地,Sunghyo Kim的文章“Crashed Software: Assessing Product Liability for Software Defects in Automated Vehicles”分析了在自动驾驶汽车中,软件缺陷如何被认定为产品责任。 此外,文章还提到了欧洲共同...

    Failure assessment diagrams for use in R6 assessments for austenitic components

    R6程序的评估重点是组件中缺陷的裂纹起始能力,早期的版本由于对奥氏体材料应变硬化能力的不适应性,在进行缺陷评估时显得不适当。第三版R6修订通过允许引入材料的特有性质,拓宽了它的适用范围,使其适用于包括...

    SAP For all entries 的效率

    在本文中,我们将详细分析 "for all entries" 语句的缺陷,及其对性能的影响。 首先,让我们来看一下 "for all entries" 语句的基本用法。例如,我们有一个表 MARA,包含了物料的信息,我们想从这个表中选取出某些...

    MISRA C-2012 Guidelines for the C language in critical systems

    遵循MISRA C 2012规范的开发过程可以显著降低软件缺陷率,提高代码质量,使得软件在关键系统中的运行更加安全可靠。然而,由于这些规则严格且详细,实施起来可能会增加开发成本和复杂性,因此需要权衡项目的需求和...

    《BDD IN ACTION:Behavior-Driven Development for the whole software lifecycle》

    ### 《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 ...

    基于改进Res-UNet网络的钢铁表面缺陷图像分割研究.docx

    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 ...

    深度学习领域yolov7算法在产品缺陷目标检测(带数据集)-detection-of-product-defects-usin

    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. ...

Global site tag (gtag.js) - Google Analytics