Set和Map数据结构

一、Set

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

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

Set函数可以接受一个数组(或者具有 iterable 接口的其他数据结构)作为参数,用来初始化。

        // 创建一个set集合,传参必须为一个可迭代对象
        const s1 = new Set([1,2,3,3,5,1])
        console.log(s1)//Set(4) {1, 2, 3, 5}

方法

①add(value)添加数据,并返回新的 Set 结构

        const s1 = new Set()
        s1.add(1)
        s1.add(1)//无效添加
        s1.add(+0)
        s1.add(-0)
        s1.add(NaN)
        s1.add(NaN)
        let obj = {}
        s1.add(obj)
        s1.add(obj)
        // Set 内部判断两个值是否不同,使用的方法为 Object.is() 除了0的比较
        console.log(s1)//Set(4) {1, 0, NaN, {…}}

②delete(value)删除数据,返回一个布尔值,表示是否删除成功

        const s1 = new Set()
        s1.add(1)
        s1.add(1)//无效添加
        s1.add(+0)
        s1.add(-0)
        s1.add(NaN)
        s1.add(NaN)
        console.log(s1.delete(1)); //true
        console.log(s1)// Set(2) {0, NaN}

③has(value)查看是否存在某个数据,返回一个布尔值

        const s1 = new Set()
        s1.add(1)//无效添加
        s1.add(+0)
        s1.add(NaN)
        console.log(s1.has(1)); //true

④clear()清除所有数据,没有返回值

        const s1 = new Set()
        s1.add(1)
        s1.add(+0)
        s1.add(NaN)
        s1.clear()
        console.log(s1); // Set(0) {}

遍历方法

        var uname = new Set(['LCY','ZGX','XZY','WJQ'])
        for (const iterator of uname) {
            // console.log(iterator);           
        }
        //LCY
        //ZGX
        //XZY
        //WJQ
        uname.forEach(element => {
            console.log(element);
        });
        //LCY
        //ZGX
        //XZY
        //WJQ
      console.log( uname.keys());// SetIterator {"LCY", "ZGX", "XZY", "WJQ"} 

二、Map

JavaScript 的对象(Object),本质上是键值对的集合(Hash 结构),但是传统上只能用字符串当作键。这给它的使用带来了很大的限制。为了解决这个问题,ES6 提供了 Map 数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。也就是说,Object 结构提供了“字符串—值”的对应,Map 结构提供了“值—值”的对应,是一种更完善的 Hash 结构实现。如果你需要“键值对”的数据结构,Map 比 Object 更合适。

     const map = new Map([
            ['a','b'],
            [{},777],
            [123,555],
            [undefined,6666]
        ])
        console.log(map)//Map(4) {"a" => "b", {…} => 777, 123 => 555, undefined => 6666}
        // 参数传递一般都是二维数组的形式,子数组只能有两项,第一项为键名,第二项为键值

方法

     const map = new Map([
            ['a','b'],
            [123,555],
        ])
        let obj = {};
        //set添加值
        map.set(obj,888)
        map.set(obj,969)//值覆盖
        console.log(map);//Map(3) {"a" => "b", 123 => 555, {…} => 969}
        //get()获取值
        console.log( map.get('a'));//'b'
        console.log(map.size);//3
        //has()是否存在
        console.log(map.has(123)); //true
        console.log(map.delete(123));  // 删除一个布尔值
        console.log(map);//Map(2) {"a" => "b", {…} => 969}
        console.log(map.clear());    // 清空所有成员 无返回
        console.log(map);//Map(0) {}

三、 Map数据结构和传统object区别(面试点)

①同名碰撞

我们知道,对象其实就是在堆开辟了一块内存,其实Map的键存的就是这块内存的地址。只要地址不一样,就是两个不同的键,这就解决了同名属性的碰撞问题,而传统的Object显然做不到这一点

②可迭代

Map实现了迭代器,可用for...of遍历,而Object不行。

③长度

Map可以直接拿到长度,而Object不行。

④有序性

填入Map的元素,会保持原有的顺序,而Object无法做到。

⑤可展开

Map可以用省略号语法展开,而Object不行。

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值