• 技术文章 >web前端 >js教程

    javascript中for与for in区别,以及为什么不推荐使用for in

    伊谢尔伦伊谢尔伦2017-07-17 14:13:36原创2638

    js中遍历数组的有两种方式

    var array=['a']
    //标准的
    for循环
    for(var i=1;i<array.length;i++){
        alert(array[i])
    }
    //
    foreach
    循环
    for(var i in array){
        alert(array[i])
    }

    正常情况下上面两种遍历数组的方式结果一样。首先说两者的第一个区别

    标准的for循环中的i是number类型,表示的是数组的下标,但是foreach循环中的i表示的是数组的key是string类型,因为js中一切皆为对象。自己试试 alert(typeof i);这个区别是小问题。现在我加上如下代码,上面的执行结果就不一样了。

    //扩展了js原生的Array
    Array.prototype.test=function()
     
    }

    试试看上面的代码执行什么。我们发现标准的for循环任然真正的对数组循环, 但是此时foreach循环对我刚才写的test方法写打印出来了。这就是for与foreach遍历数组的最大区别,如果我们在项目采用的是用foreach遍历数组,假设有一天谁不小心自己为了扩展js原生的Array类,或者引入一个外部的js框架也扩展了原生Array。那问题就来了。

    为什么不要用for in语句 ?

    关键词:原生Array类、扩展Array类
    for in 语句对数组对象进行遍历潜在的bug在于:如果原生Array类被其他的js脚本库进行了原型扩展(比如多加一个toJSON方法即Array.prototype.toJSON=xxxx),那么用for in遍历扩展后的Array对象的逻辑将与遍历原生Array对象的逻辑发生差异。
    举个简单的例子,

    var x=[1]; 
    for(var s in x){ 
    alert(s); 
    };

    按常理,如果Array是原生js类,上面语句应该只执行一次alert方法,且s为数组的索引0。但是,如果Array类被扩展了,多了一个toJSON方法,那么上面的语句将执行两次alert,第一次s为索引0,第二次s为方法名'toJSON'。

    如果你设计的代码的逻辑以原生Array类为基准,在某一天你的同事在页面里面引用了一个第三方的JS库,这个库又恰好扩展了Array类,结果将难以想象,很有可能原来的代码逻辑将不再成立。

    关于这种扩展原生JS类的库,很有名的一个就是prototype.js,它给Array类扩展了很多方法诸如toJSON,each等等。我现在明白为啥jquery的创始人曾经对prototype火大了(不少人因为特殊原因在一个页面里用jquery同时又用prototype,会有很多意料之外的冲突问题,仅仅一个noConflict是无法解决的)。另外,jqModal的作者如果看得懂我这篇文章估计也会对埋怨prototype,说:“我用for in对数组遍历是不明智的,但是更该死的还是prototype。。。”

    如上所述,如果你在用jqModal,同时因为别的原因在用prototype,恭喜你中招了。冲突将导致jqModal的弹框在ie6、ie7下面将无法利用closeClass设置的按钮进行自动关闭。跟踪调试代码你将发现,异常的地方就在本文开头提到的hs方法的for in 循环中。。。
    三,解决问题
    遍历数组的地方,用for var 语句代替for in。

    以上就是javascript中for与for in区别,以及为什么不推荐使用for in的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:javascript 为什么 js
    上一篇:有哪些方法使用jquery遍历数组和对象 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • 一文浅析node中如何使用消息队列• 【翻译】使用自定义hooks对React组件进行重构• 一文详解Node中express的身份认证• Angular学习之聊聊生命周期• 浅析Angular中的自定义结构型/属性型指令
    1/1

    PHP中文网