zoukankan      html  css  js  c++  java
  • javascript中的for in循环和for循环的使用

    原文链接:http://caibaojian.com/js-loop-for-in.html

    javascript for...in 语句

    for...in 语句用于对数组或者对象的属性进行循环操作。

    for ... in 循环中的代码每执行一次,就会对数组的元素或者对象的属性进行一次操作。

    viaTip:for-in循环应该用在非数组对象的遍历上,使用for-in进行循环也被称为“枚举”。原文来自:http://caibaojian.com/js-loop-for-in.html

    语法:

    for (in 象)
    {
        码
    }

    “变量”用来指定变量,指定的变量可以是数组元素,也可以是对象的属性。

    实例:使用 for ... in 循环遍历数组。

    <html>
    <body>
    <script type="text/javascript">
    var x
    var mycars = new Array()
    mycars[0] = "Saab"
    mycars[1] = "Volvo"
    mycars[2] = "BMW"
    for (x in mycars)
    {
    document.write(mycars[x] + "<br />")
    }
    </script>
    </body>
    </html>

    应用可见这里:http://caibaojian.com/js-max-repeat.html

    注意一:for in循环不会按照属性的下标来排列输出。http://www.cnblogs.com/rubylouvre/p/3396042.html

    "first":"first",
       "zoo":"zoo",
      "2":"2",
      "34":"34",
      "1":"1",
      "second":"second"
    };
    for (var i in obj) { console.log(i); };
    1
    2
    34
    first
    zoo
    second

    执行时按chrome执行,先把当中的非负整数键提出来,排序好输出,然后将剩下的定义时的顺序输出。由于这个奇葩的设定,让avalon的ms-with对象排序不按预期输出了。只能强制用户不要以纯数字定义键名。

    实例1:在数组的原型对象上定义了一个新的属性,使用for循环没出现问题

    function getNewArray(){
    var array=[1,2,3,4,5];
    Array.prototype.age=13;
    var result = [];
    for(var i=0;i<array.length;i++){
    result.push(array[i]);
    }
    alert(result.join(''));
    }

    实例2:采用了for in循环,但是给我们期望的一样还是得到了12345的正确结果

    //code from http://caibaojian.com/js-loop-for-in.html
    function getArrayTwo(){
    var array=[1,2,3,4,5 ];
    var result=[];
    for(var i in array){
    result.push(array[i]);
    }
    alert(result.join(''));
    }

    实例3:给原型添加属性之后,默认情况下枚举,最后输出1234513

    function getNewArrayTwo(){
    var array=[1,2,3,4,5 ];
    Array.prototype.age=13;
    var result=[];
    for(var i in array){
    result.push(array[i]);
    }
    alert(result.join(''));
    }

    所以建议不要对数组执行for in循环,事实上,在高性能javascript这本书中,也强调了for in循环的不好,因为它总是会访问该对象的原型,看下原型上是否有属性,这在无意中就给遍历增加了额外的压力。

    解决方法:

    如果某个对象具有给定名称的属性,那么Object.prototype.hasOwnProperty(name)返回true。如果该对象是从原型链中继承了该属性,或者根本没有这样的一个属性,则返回false。通过hasOwnProperty限定for in循环在当前中遍历,而不用去考虑它的原型属性。

    function finalArray(){
    var array=[1,2,3,4,5 ];
    Array.prototype.age=13;
    var result=[];
    for(var i in array){
    if(array.hasOwnProperty(i)){
    result.push(array[i]);
    }
    }
    alert(result.join(''));
    }

    注意事项:

    1.有一部分浏览器,例如早期的safari浏览器,不支持这个方法

    2.对象经常被用作哈希值,这就是存在hasOwnProperty被另外的属性屏蔽的风险(但是我估计没有人那么无聊使用这个属性)

  • 相关阅读:
    JavaWeb学习之什么是Servlet、如何使用servlet、为什么这样使用、servlet的虚拟路径、关于缺省Servlet(2)
    Android Drawable
    Android 热补丁和热修复
    Android Immersive Mode (沉浸模式) 还是 Translucent Bars (透明状态栏)
    Android & iOS 第三方 Crash ANR 捕捉上传
    Android中的dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()
    Android Volley
    Android HttpURLConnection And HttpClient
    Android Fragment 生命周期及其正确使用(建议使用自定义View替换Fragment)
    Android Intent (可通过URL启动 Activity)
  • 原文地址:https://www.cnblogs.com/lzm1989/p/5967832.html
Copyright © 2011-2022 走看看