ES6中新增的重要功能:Set和Map、Promise、async和await

一、Set和Map

Set是一个不能有重复元素的集合。
Set中的所有的数据都不是按索引排列的。
因为没有索引,遍历时不能使用for和for in,只能使用for of、forEach...

  • Set的方法实现
    //新建Set
    let set = new Set([1, 2, 3, 4, 5])
    console.log(set)//Set(5) {1, 2, 3, 4, 5}
    //添加元素
    set.add(10);
    console.log(set)//Set(6) {1, 2, 3, 4, 5,10}
    //删除元素
    set.delete(5);
    console.log(set)//Set(6) {1, 2, 3, 4,10}
    //判断此元素是否是该Set的成员
    console.log(set.has(5))//false
    console.log(set.has(10))//true
    //清除所有元素
    set.clear();
    console.log(set)//Set(0) {}
  • Set的遍历
    //使用forEach
    let set = new Set([1, 2, 10, 4, 5])
    set.forEach(value=>console.log(value))//1  2  10  4  5
    //使用for of
    for(var value of set){
        console.log(value)//1  2  10  4  5
    }
  • Set的应用 — 数组去重
   let arr=[1,1,2,2,4,4,3,0]
   let set = new Set(arr)
   console.log(set)//Set(5) {1, 2, 4, 3, 0}

Map用键值对来存储数据,有长度
Map中key和value可以是任何类型

  • Map的方法实现
    //创建Map
    var map = new Map()
    //设置Map值
    map.set("name", "大南瓜")
    map.set("age", "18")
    map.set("color", "橙色")
    console.log(map)//Map(3) {"name" => "大南瓜", "age" => "18", "color" => "橙色"}
    //获取属性名对应的属性值
    console.log(map.get("name"))//大南瓜
    //删除属性
    map.delete("age");
    console.log(map)//Map(2) {"name" => "大南瓜", "color" => "橙色"}
    //判断是否存在该属性
    console.log(map.has("name"));//true
    console.log(map.has("age"));//false 因为刚刚已经删除,所以不存在
    //判断长度(数据个数)
    console.log(map.size)//2
    //清除所有数据
    map.clear() 
    console.log(map)//Map(0) {}
  • Map的遍历
    //创建Map
    var maps = new Map()
    //设置Map值
    maps.set("name", "大南瓜")
    maps.set("age", "18")
    maps.set("color", "橙色")
    // 对象的遍历
    for (let obj of maps) {
        console.log(obj);
        /*  (2) ["name", "大南瓜"]
            (2) ["age", "18"]
            (2) ["color", "橙色"] */
    }
    //属性名的遍历
    for (let key of maps.keys()) {
        console.log(key);//name  age  color
    }
    //属性值的遍历
    for (let value of maps.values()) {
        console.log(value);//大南瓜  18  橙色
    }
    //返回所有成员的遍历器
    for (let item of maps.entries()) {
        console.log(item);//和对象的遍历结果一样
    }
    //forEach遍历
    maps.forEach((v, k, list) => { console.log(v, k, list) })
    /* 大南瓜 name > Map(3) { "name" => "大南瓜", "age" => "18", "color" => "橙色" }
    18 age > Map(3) { "name" => "大南瓜", "age" => "18", "color" => "橙色" }
    41 橙色 > color Map(3) { "name" => "大南瓜", "age" => "18", "color" => "橙色" } */

二、Promise

Promise对象是一个构造函数,用来生成Promise实例

  • 基本结构——以图片加载函数为例
function getImgs(src) {
        return new Promise(function (resolve, reject) {
            // 参数resolve、reject分别表示异步操作执行成功后和失败后的回调函数
            let img = new Image();
            img.src = src;
            img.onload = function (e) {
                resolve(img);//resolve将Promise的状态置为fullfiled
            };
            img.onerror = function (e) {
                reject("错误");//reject将Promise的状态置为rejected
            }
        });
    }
  • then方法,用以访问当前值、最终的返回值以及失败的原因。多个then方法连用将会形成链式异步
    // 接受两个函数参数
    getImgs("img01.png").then(function (img) {
        console.log(img);//对应于状态变化到Resolved时的函数调用
    }), function (error) {
        console.log(error);//对应于状态变化到Rejected时的函数调用
    }
  • catch方法,就相当于.then(undefined, onRejected)
      getImgs("img01.png").then(function (img) {
            console.log(img);
      }).catch(function (error) {
          console.log(error);//带一个参数,为失败时的回调
      })
  • all方法,用于全部异步完成统一执行
Promise.all([getImgs("1.png"), getImgs("2.png"), getImgs("3.png")])
        .then(function (imgArr) {
            //根据异步调用的先后顺序获取到一个数组,数组中就是所有传入的参数
            for (let i = 0; i < imgArr.length; i++) {
                document.body.appendChild(imgArr[i]);
            }
        })
  • race方法,用于同时执行多个异步,哪个先完成就处理这个先完成的
 Promise.race([getImgs("1.png"), getImgs("2.png"), getImgs("3.png")])
        .then(function (img) {
            //只返回最先加载的数据
            document.body.appendChild(img);
        })

三、async和await

async 函数返回一个 Promise 对象,里面的return相当于promise中的resolve,await 下面的代码属于微任务

 //基本写法
 async function allLoad() {
      var arr = [];
      for (var i = 10; i < 18; i++) {
        // 阻塞式异步
        await loadImage("01.jpg").then(function (img) {
          arr.push(img);
        });
      }
      return arr;
    }

四、异步加载案例

异步分为宏任务和微任务,前者将当前任务放在下一个任务列最顶部,有setTimeout setInterval,后者将当前任务放在当前任务列的最底部,有Promise async await

//以下注释中的数字标示为执行顺序
   async function async1() {
        console.log('async1 start');//2 同步

        await async2();
        //await 下面的代码属于微任务
        console.log('async1 end')//5 当前任务列1
    }
    async function async2() {
        console.log('async2')//3 同步
    }
    
    console.log('script start');//1 同步
    setTimeout(function () {
        console.log('setTimeout')//7 下一个任务列
    }, 0);
    async1();
    new Promise(function (resolve) {
        console.log('promise1');//4 同步
        resolve()
    }).then(function () {
        console.log('promise2')//6 当前任务列2
    });
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,335评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,895评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,766评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,918评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,042评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,169评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,219评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,976评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,393评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,711评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,876评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,562评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,193评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,903评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,699评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,764评论 2 351