ES6的Set、Map、Promise和类语法

本文介绍了ES6中的Set和Map数据结构,它们分别用于存储不重复值的集合和任意键值对,以及如何进行操作和遍历。此外,还讲解了Promise对象在异步编程中的作用,它是解决回调地狱问题的有效方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

8 set和Map

1>set

ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的没有重复的值

Set本身是一个构造函数,用来生成 Set 数据结构。

        const set = new Set();
        // 向set中添加数据
        set.add(10);
        set.add(10);
        set.add(20);
        console.log("set:", set); // set: Set(2) {10, 20}
        const arr = Array.of(10, 10, 20);
        console.log("arr:", arr); // arr: (3) [10, 10, 20]
        // 利用set可以对数组进行去重,将一个数组转换成set
        const set2 = new Set(arr);
        console.log("set2:", set2); // set2: Set(2) {10, 20}
        
		// set集合在遍历时,使用for--of
        for (let i of set2) {
            console.log(i); // 10 20
        }

        // 字符串本身也是数组
        const set3 = new Set("ababcdesa");
        console.log(set3); // Set(6) {'a', 'b', 'c', 'd', 'e', …}
        // 将set变成数组
        const arr1 = [...set3];
        console.log("arr1:", arr1); // arr1: (6) ['a', 'b', 'c', 'd', 'e', 's']
        // 使用数组的join方法,进行拼接
        console.log(arr1.join('')); // abcdes

2>map

JavaScript 的对象(Object),本质上是键值对的集合(Hash 结构),但是传统上只能用字符串当作键,为了解决这个问题,ES6 提供了 Map 数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。

        const map = new Map();
        // 向map种添加数据
        map.set('name', '旺财');
        map.set('age', 5);
        // 不允许存在重复的key
        map.set("name", "旺财2");
        console.log("map:", map); // Map(2) {'name' => '旺财2', 'age' => 5}
        // 通过key获取值
        const value = map.get("name");
        console.log(value); // 旺财2
        // clear():清除map中的所有元素
        //map.clear();
        // 获取map中元素的个数 size
        console.log(map.size); // 2
        // has方法:判断map中是否存在指定的key
        console.log(map.has('age1')); // false

遍历map:

        // 1. forEach遍历 map,获取到的是遍历的值
        map.forEach(item => {
            console.log(`item:${item}`); // item:旺财2 item: 5
        });
        // 2. 获取map中所有的key: map.keys()
        for (let key of map.keys()) {
            console.log(`${key}1--->${map.get(key)}`); // name1--->旺财2 age1--->5

        }
        // 3. 获取map中所有的entries: map.entries()
        for (let [key, value] of map.entries()) {
            console.log(`${key}2--->${value}`); // name2--->旺财2 age2--->5
        }
        // map的键可以是任意类型
        map.set(false, "小明");
        console.log(map); // Map(3) {'name' => '旺财2', 'age' => 5, false => '小明'}

Symbol:ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值

        const a = Symbol();
        const b = Symbol();
        console.log(a === b); // false

        map.set(Symbol(), "abc");
        map.set(Symbol(), "def");
        console.log("map:", map);

        //  Symbol作为键是否可以遍历出来?是。
        for (let item of map) {
            console.log("item", item);
        }

        // 让创建的symbol为同一个值
        const d = Symbol.for('a');
        const e = Symbol.for('a');
        console.log(d === e); // true

9 类语法

        // 类就是自定义构造函数
        // function Dog(name, type) {
        //     this.name = name;
        //     this.type = type;
        // }

        // // 方法:定义在所属构造函数的原型上
        // Dog.prototype.show = function () {
        //     console.log(this.name + "----" + this.type);
        // }

        // 使用es6提供的类语法 ,使用class关键字。抽象的概念
        class Dog {
            // 构造函数,创建对象
            constructor(name, type) {
                this.name = name;
                this.type = type;
            }
            // 方法,定义在原型上的
            show() {
                console.log(this.name + "----" + this.type);
            }
            say() {
                console.log("Hello World1");
            }

            // 静态方法: 该方法不属于具体实例,而是归类所有,通过类名去调用.在方法之前加上static,(就表示该方法不会被实例继承,而是直接通过类来调用)
            static say2() {
                console.log("我是一个静态方法");
            }

        }
        // 静态属性:该属性不属于具体实例,而是归类所有,通过类名去调用.
        Dog.color = "red";

        const dog = new Dog("旺财", "泰迪");
        dog.show();
        const dog2 = new Dog("小虎", "藏獒");
        dog2.show();
        console.log(dog.show === dog2.show);

        console.log(typeof Dog); // function
        console.log(Dog.prototype); // object
        console.log(dog.__proto__ === Dog.prototype) // true

        // 调用静态方法
        Dog.say2(); // 我是一个静态方法
        // 调用静态属性
        console.log(Dog.color); // red

10 promise

Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。

多层回调函数的相互嵌套,就形成了回调地狱。大量代码相互嵌套难以阅读,耦合性太强难以维护,而promise是为了解决地域回调问题而提出的。

Promise异步操作的结果,可以调用resolvereject回调函数处理。

resolve代表的是回调成功的结果,reject代表的是回调失败的结果。

  • promise是一个构造函数
    • 我们可以创建 Promise 的实例 const p = new Promise()
    • new 出来的 Promise 实例对象,代表一个异步操作
  • Promise.prototype 上包含一个 .then() 方法
    • 每一次 new Promise() 构造函数得到的实例对象,都可以通过原型链的方式访问到 .then() 方法,例如:p.then()
  • .then() 方法用来预先指定成功和失败的回调函数
    • p.then( 成功的回调函数, 失败的回调函数 )
    • 调用 .then() 方法时,成功的回调函数是必选的,失败的回调函数是可选的

在 Promise 的链式操作中如果发生了错误,可以使用 Promise.prototype.catch 方法进行捕获和处理:如果不希望前面的错误导致后续的 .then 无法正常执行,则可以将 .catch 的调用提前。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值