• 技术文章 >web前端 >前端问答

    es6新增循环有哪些

    青灯夜游青灯夜游2022-11-07 19:29:10原创246

    es6新增循环语句有一个:“for of”循环。“for..of”语句可循环遍历整个对象,是在迭代器生产的一系列值的循环;“for..of”循环的值必须是一个iterable(可迭代的),语法“for(当前值 of 数组){...}”。for-of循环不仅支持数组,还支持大多数类数组对象;它也支持字符串遍历,会将字符串视为一系列Unicode字符来进行遍历。

    大前端成长进阶课程:进入学习

    本教程操作环境:windows7系统、ECMAScript 6版、Dell G3电脑。

    以前for循环,for in循环;而ES6新增循环:for of 循环:遍历(迭代,循环)整个对象。

    for..of

    ES6新增了一个for..of循环,在迭代器生产的一系列值的循环。for..of循环的值必须是一个iterable

    var a = ["a", "b","c","d","e"]
    for(var idx in a){
        console.log(idx)
    }
    // 0 1 2 3 4
    for(var val of a){
        console.log(val)
    }
    // a b c d e

    for..in在数组a的键/索引上循环,for..ofa的值上循环。【相关推荐:javascript视频教程web前端

    ES6之前的代码

    var a = ["a", "b","c","d","e"]
    for(var val, ret, it = a[Symbol.iterator]();(ret=it.next()) && !ret.done){
        val = ret.value
        console.log(val)
    }
    // a b c d e

    在底层,for..of循环向iterable请求一个迭代器,然后反复调用这个迭代器把它产生的值赋给循环迭代变量。

    JavaScript默认为iterable的标准内建值包括:

    字符串迭代方式

    for(var c of "hello"){
        console.log(c)
    }
    // h e l l o

    原生字符串值被强制类型转换到等价的String封装对象中,它是一个iterable

    for(XYZ of ABC)

    对于XYZ这个位置既可以是赋值表达式,也可以是声明。下面看个赋值表达式的例子:

    var o = {}
    for(o.a of [1,2,3]){
        console.log(o.a)
    }
    o // {a:3}
    for({x:o.a} of [{x:1},{x:2},{x:3}]){
        console.log(o.a)
    }
    o // {a:3}

    通过break,continue,return提前终止循环。

    自定义迭代器

    通过对底层的了解,for..ofiterable请求一个迭代器,然后反复调用这个迭代器把它产生的值赋给循环迭代变量。那么我可以自定义一个iterable

    var o = {
        [Symbol.iterator](){
            return this
        },
        next(){
            if(!val){
                val = 1
            }else{
                val ++
            }
            return {value:val, done:val== 6}
        }
    }
    for(var val of o[Symbol.iterator]()){
        console.log(val)
    }

    由此可见,自定义迭代器满足两个条件,[Symbol.iterator]属性,返回的对象中有next方法,next方法返回值必须是{value:xx,done:xx}的形式,如果遇到done:true,则循环结束。

    结语:以上就是for..of循环的全部内容,它可以循环可迭代对象。

    扩展知识:为什么要引进 for-of?

    要回答这个问题,我们先来看看ES6之前的 3 种 for 循环有什么缺陷:

    所以,鉴于以上种种缺陷,我们需要改进原先的 for 循环。但 ES6 不会破坏你已经写好的 JS 代码。目前,成千上万的 Web 网站依赖 for-in 循环,其中一些网站甚至将其用于数组遍历。如果想通过修正 for-in 循环增加数组遍历支持会让这一切变得更加混乱,因此,标准委员会在 ES6 中增加了一种新的循环语法来解决目前的问题,即 for-of 。

    那 for-of 到底可以干什么呢?

    总结一下,for-of 循环有以下几个特征:

    但需要注意的是,for-of循环不支持普通对象,但如果你想迭代一个对象的属性,你可以用
    for-in 循环(这也是它的本职工作)。

    最后要说的是,ES6 引进的另一个方式也能实现遍历数组的值,那就是 Iterator。上个例子:

    const arr = ['a', 'b', 'c'];
    const iter = arr[Symbol.iterator]();
     
    iter.next() // { value: 'a', done: false }
    iter.next() // { value: 'b', done: false }
    iter.next() // { value: 'c', done: false }
    iter.next() // { value: undefined, done: true }

    前面的不多说,重点描述for-of

    for-of循环不仅支持数组,还支持大多数类数组对象,例如DOM NodeList对象

    for-of循环也支持字符串遍历,它将字符串视为一系列的Unicode字符来进行遍历:

    window.onload=function(){ 
       const arr = [55,00, 11, 22];
       arr.name = "hello";
      // Array.prototype.FatherName = 'FatherName';
       /*for(let key in arr){
        console.log('key='+key+',key.value='+arr[key]);
       }*/
       /* arr.forEach((data) => {console.log(data);});*/
      /* arr.forEach((data,index,arr) => {console.log(data+','+index+','+arr);});*/
      /*for(let key of arr){
        console.log(key);
      }*/
      var string1 = 'abcdefghijklmn';
      var string2 = 'opqrstuvwxyc';
      const stringArr = [string1,string2];
      for(let key of stringArr){
        console.log(key);
      }
      for(let key of string1){
        console.log(key);
      }
    }

    结果:

    1.png

    现在,只需记住:

    for-in循环用来遍历对象属性。

    for-of循环用来遍历数据—例如数组中的值。

    它同样支持Map和Set对象遍历。

    Map和Set对象是ES6中新增的类型。ES6中的Map和Set和java中并无太大出入。

    SetMap类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在Set中,没有重复的key。

    要创建一个Set,需要提供一个Array作为输入,或者直接创建一个空Set

    var s1 = new Set(); // 空Set
    var s2 = new Set([1, 2, 3]); // 含1, 2, 3

    2.png

    重复元素在Set中自动被过滤:

    var s = new Set([1, 2, 3, 3, '3']);
    console.log(s); // Set {1, 2, 3, "3"}

    3.png

    通过add(key)方法可以添加元素到Set中,可以重复添加,但不会有效果:

    var s = new Set([1, 2, 3]);
    s.add(4);
    s; // Set {1, 2, 3, 4}
    s.add(4);
    s; // Set {1, 2, 3, 4}

    通过delete(key)方法可以删除元素:

    var s = new Set([1, 2, 3]);
    s; // Set {1, 2, 3}
    s.delete(3);
    s; // Set {1, 2}

    Set对象可以自动排除重复项

    var string1 = 'abcdefghijklmn';
      var string2 = 'opqrstuvwxyc';
      var string3 = 'opqrstuvwxyc';
      var string4 = 'opqrstuvwxyz';
     
      const stringArr = [string1,string2,string3,string4];
     
     
     var newSet = new Set(stringArr);
      for(let key of newSet){
        console.log(key);
      }

    结果:

    4.png

    Map对象稍有不同:内含的数据由键值对组成,所以你需要使用解构(destructuring)来将键值对拆解为两个独立的变量:

    for (var [key, value] of phoneBookMap) {   
    console.log(key + "'s phone number is: " + value);
    }

    示例

    var m = new Map([[1, 'Michael'], [2, 'Bob'], [3, 'Tracy']]);
      var map = new Map([['1','Jckey'],['2','Mike'],['3','zhengxin']]);
      map.set('4','Adam');//添加key-value
      map.set('5','Tom');
      map.set('6','Jerry');
      console.log(map.get('6'));
      map.delete('6');
       console.log(map.get('6'));
      for(var [key,value] of map) {
        console.log('key='+key+' , value='+value);
      }

    结果:

    5.png

    以上就是es6新增循环有哪些的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

    前端(VUE)零基础到就业课程:点击学习

    清晰的学习路线+老师随时辅导答疑

    自己动手写 PHP MVC 框架:点击学习

    快速了解MVC架构、了解框架底层运行原理

    上一篇:jquery怎么判断一个元素是否是另一个元素的子元素 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • ❤️‍🔥共22门课程,总价3725元,会员免费学• ❤️‍🔥接口自动化测试不想写代码?• es6怎么修改数组的值• es6怎么移除全部数组元素• class在es6中本质是什么• es6中find()怎么用• es6怎么找出2个数组中不同项• es6中有没有&符号
    1/1

    PHP中文网