• 对forEach、for-in还有es6的for-of的一些整理


    用forEach遍历数组的话,不能用break跳出循环,也不能用return返回外层
    如果要提前终止,必须把forEach()方法放在一个try块中,并能抛出一个异常。如果forEach()调用的函数抛出foreach.break异常,循环会提前终止。
     
    function foreach(a,f,t){
        try { a.forEach(f,t); }
        catch(e){
            if(e === foreach.breakreturn;
            else throw e;
        }
    }
    foreach.break = new Error("StopIteration");
     
    for...in 循环只遍历可枚举属性。像 Array 和 Object , Number等 js中基本包装类型的原型属性是不可枚举的 , 它们是使用内置构造函数所创建的对象都会继承自 Object.prototype 和 String.prototype 的不可枚举属性,例如 String 的 indexOf()  方法或者 Object 的 toString 方法。循环将迭代对象的所有可枚举属性和从它的构造函数的 prototype 继承而来的(包括被覆盖的内建属性)。
    可以注意到for-in循环能够枚举继承的属性名,所以在数组上不建议使用for-in循环
    可以使用 hasOwnProperty方法来过滤。所有继承了 Object 的对象都会继承到 hasOwnProperty 方法。这个方法可以用来检测一个对象是否含有特定的自身属性;和 in 运算符不同,该方法会忽略掉那些从原型链上继承到的属性。
     
    for(var i in a){
         if(!a.hasOwnProperty(i)) continue;//跳过继承的属性
         //循环体
    }
     
    不建议用for-in循环遍历数组还有以下几点原因:
    • 代码中的index不是数字,是字符串“0”、“1”、“2”,可能无意间进行字符串的计算“2”+1=“21”等。
    • 代码可能按照随机顺序遍历数组元素。
    for-in是为了对象设计的,可以遍历字符串型的键。
     
    ps:属性的枚举性还会影响以下两个函数的结果:  Object.keys() ;  JSON.stringify();  它们只能返回对象本身具有的可枚举属性。
     
    for-of循环
     
    for(var value of myArray){
         console.log(value);
    }
    它和forEach不同,它可以break、continue、return。同时又避开了for-in 的缺点。
    for-of可以遍历:
    • 数组
    • 大多数类数组对象:如DOM的NodeList对象
    • 字符串
    • 也支持map和set对象的遍历
    例如
     
    //遍历Set
    //基于单词数组创建一个set对象
    var uniqueWords= new Set(words);
     
    forvar word of uniqueWords){
         console.log(word);
    }
     
    //遍历Map
    //map是键值对组成的,所以需要解构来将键值对拆解为两个独立变量:
    forvar[key,value] of phoneBookMap){
         console.log(key+"'s phone number is:" + value);
    }
     
    for-of不支持普通对象,如果你想迭代一个对象属性,可以用for-in循环或内建Object.keys()方法:
     
    for(var key of object.keys(someObject)){
         console.log(key+":"+someObject[key]);
    }
    for-in循环用来遍历对象属性,for-of循环用来遍历数据--如数组中的值。
     
  • 相关阅读:
    解决centos7的root账户下无法通过code命令启动vscode
    centos7安装epel
    centos7用过yum安装vscode
    yum install gcc报错Error: Package: glibc-2.17-260.el7_6.6.i686 (updates) Requires: glibc-common = 2.17
    centos7通过yum从vim7升级到vim8
    解决VM虚拟机安装centos7无法联网
    centos7设置开机默认使用root账户登陆
    centos7使用sudo命令提示sudo command not found
    不同编译器下C++基本数据类型的字节长度
    C++函数模板
  • 原文地址:https://www.cnblogs.com/ja-clin/p/6556793.html
Copyright © 2020-2023  润新知