JS 怎么理解ES6新增Set、Map两种数据结构?

这篇具有很好参考价值的文章主要介绍了JS 怎么理解ES6新增Set、Map两种数据结构?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、前言

二、Set

1.Set数据结构定义

2.Set数据结构的特性

3.Set数据结构的基本使用

4.Set遍历数据

5.Set 的使用场景

6.WeakSet的使用

7.垃圾回收机制

三、Map

1.Map数据结构定义

2.Map数据结构的特性

3.Map数据结构的基本使用

 4.Map遍历数据

5.Map的使用场景

6.WeakMap的使用

7.垃圾回收


一、前言

Set是一种叫做集合的数据结构,Map是一种叫做字典的数据结构

什么是集合?什么又是字典?

集合是由一堆无序的、相关联的,且不重复的内存结构【数学中称为元素】组成的组合

字典是一些元素的集合。每个元素有一个称作key 的域,不同元素的key 各不相同

区别?

共同点:集合、字典都可以存储不重复的值
不同点:集合是以[值,值]的形式存储元素,字典是以[键,值]的形式存储

下面对这两种数据结构进行详解

二、Set

1.Set数据结构定义

用于存储任何类型的唯一值,无论是基本类型还是对象引用。

2.Set数据结构的特性

(1) 只能保存值没有键名
(2) 严格类型检测如字符串数字不等于数值型数字
(3) 值是唯一的
(4) 遍历顺序是添加的顺序,方便保存回调函数

3.Set数据结构的基本使用

(1) add: 添加元素

使用 add 添加元素,不允许重复添加相同的值

let set = new Set()
set.add(1).add(1).add(1);
console.log(set.values());  // [1]

Set严格区分值类型 1 和 '1' 属于两个不同的值

let set = new Set();
set.add(1);
set.add('1');
console.log(set.values());  // [1,'1']

(2) has: 检测元素是否存在,返回布尔值,存在返回 true

let set = new Set();
set.add(1);
set.has(1); // true

(3) size 返回 Set 长度

let set = new Set(['zs', 'lisi']);
console.log(set.size); // 2

(4) delete: 删除单个元素方法,返回值为boolean类型

let set = new Set(['zs', 'lisi']);
set.delete('zs');
console.log(set.values()); // ['lisi']

(5) clear: 清空所有成员,没有返回值

let set = new Set(['zs', 'lisi']);
set.clear();
console.log(set.values()); // []

(6) 数组转换

可以使用 点语法Array.form 静态方法将Set类型转为数组,这样就可以使用数组处理函数了

let set = new Set(['zs', 'lisi']);
console.log([...set]); //  ['zs', 'lisi']
console.log(Array.from(set)); //  ['zs', 'lisi']

4.Set遍历数据

(1). forEach():使用回调函数遍历每个成员

let set = new Set(['zs', 'lisi'])
set.forEach((item, index) => {
    console.log(item, index); // zs zs  lisi lisi
});

(2). keys():返回键名的遍历器

let set = new Set(['zs', 'lisi']);
for (let i of set.keys()) {
    console.log(i); // zs lisi
}

(3). values():返回键值的遍历器

let set = new Set(['zs', 'lisi']);
for (let i of set.values()) {
    console.log(i); // zs lisi
}

(4) entries():返回键值对的遍历器

let set = new Set(['zs', 'lisi']);
for (let i of set.entries()) {
    console.log(i); // ['zs','zs'] ['lisi','lisi']
}

5.Set 的使用场景

(1). 利用Set实现去重

实现字符串去重

let str = 'helloworld';
console.log([...new Set(str)]); // ['h', 'e', 'l', 'o', 'w', 'r', 'd']

实现数组去重

let arr = [1, 2, 3, 4, 1, 2];
console.log([...new Set(arr)]); // [1, 2, 3, 4]

(2).实现并集,交集,差集

            let a = new Set([1, 2, 3]);
            let b = new Set([2, 3, 4]);

            // 并集
            let bingji = new Set([...a, ...b]);
            console.log(bingji.values()); // [1,2,3,4]
            // 交集
            let jiaoji = new Set([...a].filter((x) => b.has(x)));
            console.log(jiaoji.values()); // [2,3]
            // (a 相对于 b 的)差集
            let chaji = new Set([...a].filter((x) => !b.has(x)));
            console.log(chaji.values()); // [1]

6.WeakSet的使用

WeakSet结构同样不会存储重复的值,它的成员必须只能是对象类型的值

WeakSet的特性  

   (1). 垃圾回收不考虑WeakSet,即被WeakSet引用时引用计数器不加一,所以对象不被引用时不管WeakSet是否在使用都将删除
   (2). 因为WeakSet 是弱引用,由于其他地方操作成员可能会不存在,所以不可以进行forEach( )遍历等操作
   (3). 也是因为弱引用,WeakSet 结构没有keys( ),values( ),entries( )等方法和size属性
   (4). 因为是弱引用所以当外部引用删除时,希望自动删除数据时使用 WeakSet

   (5). WeakSet没有size属性

(1) WeakSet的值必须为对象类型,若为其他类型会报错

            // 正确声明
            let weakSet = new WeakSet([
                [1, 2],
                [3, 4],
            ]);
            // 错误声明
            let weakSet1 = new WeakSet([1, 2]); //  Invalid value used in weak set

(2) 当使用WeakSet保存 DOM 节点时,当DOM节点删除时,WeakSet会自动删除对DOM节点的引用,不用担心dom节点从文档中移除产生内存泄漏的问题

7.垃圾回收机制

WeaSet保存的对象不会增加引用计数器,如果一个对象不被引用了会自动删除。

        let set = new WeakSet();
        let arr = ['zs', 'lisi'];
        set.add(arr, 123);
        arr = null;
        console.log(set);
        setTimeout(() => {
            console.log(set);
        }, 1000);

三、Map

1.Map数据结构定义

Map是一组键值对的结构,用于解决以往不能用对象做为键的问题

2.Map数据结构的特性

(1) 具有极快的查找速度
(2) 函数、对象、基本类型都可以作为键或值

3.Map数据结构的基本使用

(1) set 添加元素,支持链式操作

            let map = new Map([]);
            map.set('name', 'zs');
            map.set('age', '18');
            map.set('hobby', [1, 2, 3]).set('a', 'b');
            console.log(map);

JS 怎么理解ES6新增Set、Map两种数据结构?

(2).get 获取元素

            let map = new Map([
                ['name', 'zs'],
                ['age', 18],
            ]);
            console.log(map.get('name')); // 'zs'

(3).size 获取数量,返回map长度

            let map = new Map([
                ['name', 'zs'],
                ['age', 18],
            ]);
            console.log(map.size); // 2

(4).has 利用key值检测是否存在,返回布尔值,存在返回true

            let map = new Map([
                ['name', 'zs'],
                ['age', 18],
            ]);
            console.log(map.has('name')); // true
            console.log(map.has('hobby')); // false

(5).delete方法 删除单个元素

            let map = new Map([
                ['name', 'zs'],
                ['age', 18],
            ]);
            map.delete('name');
            console.log(map.has('name')); // false

(6).clear方法 清空map所有元素

            let map = new Map([
                ['name', 'zs'],
                ['age', 18],
            ]);
            map.clear('name');
            console.log(map.size); // 0

(7).数据转换

可以使用 展开语法Array.form 静态方法将Map类型转为数组,这样就可以使用数组处理函数了 

            let map = new Map([
                ['name', 'zs'],
                ['age', 18],
            ]);
            console.log([...map]);
            console.log(Array.from(map));

JS 怎么理解ES6新增Set、Map两种数据结构?

 4.Map遍历数据

keys():返回键名的遍历器
values():返回键值的遍历器
entries():返回所有成员的遍历器
forEach():遍历 Map 的所有成员

            let map = new Map([
                ['name', 'zs'],
                ['age', 18],
            ]);
            map.forEach((value, key) => {
                console.log(key, value); // name zs  // age 18
            });

            for (let i of map.keys()) {
                console.log(i); // name age
            }

            for (let value of map.values()) {
                console.log(value); // zs 18
            }

            for (let entries of map.entries()) {
                console.log(entries); // ['name','zs'] ['age',18]
            }
            // 等同于上面的 map.entries()
            for (let [key, value] of map.entries()) {
                console.log(key, value); // name zs // age 18
            }

5.Map的使用场景

(1) 当页面中有多个表单元素需要进行数据交互时,可以使用Map来存储表单数据

            const formData = new Map();
            formData.set('username', 'zs');
            formData.set('password', '123456');
            const username = formData.get('username'); //zs
            const password = formData.get('password'); //123456

通过使用Map来管理数据,可以使代码更加简洁和易于维护

6.WeakMap的使用

WeakMap 对象是一组键/值对的集

(1) 键名必须是对象
(2) WeaMap对键名是弱引用的,键值是正常引用
(3) 垃圾回收不考虑WeaMap的键名,不会改变引用计数器,键在其他地方不被引用时即删除
(4) 因为WeakMap 是弱引用,由于其他地方操作成员可能会不存在,所以不可以进行forEach( )遍历等操作
(5) 也是因为弱引用,WeaMap 结构没有keys( ),values( ),entries( )等方法和 size 属性
(6) 当键的外部引用删除时,希望自动删除数据时使用 WeakMap

(1) WeakMap的值必须为对象类型,若为其他类型会报错

            let weakMap = new WeakMap();
            // 正确声明
            weakMap.set({ name: 'zs' }, 'lisi');
            // 错误声明
            weakMap.set(1, 2); // Invalid value used as weak map key
            // at WeakMap.set (<anonymous>)
            weakMap.set(null, 1); //  Invalid value used as weak map key
            // at WeakMap.set (<anonymous>)

(2) 利用WeakMap 保存 DOM节点

    <body>
        <div>zs</div>
        <div>lisi</div>
    </body>
    <script>
        const map = new WeakMap();
        document.querySelectorAll('div').forEach((item) => map.set(item, item.innerHTML));
        console.log(map); //WeakMap {div => "zs", div => "lisi"}
    </script>

7.垃圾回收

WakeMap的键名对象不会增加引用计数器,如果一个对象不被引用了会自动删除。

下例当 obj 删除时内存即清除,因为WeakMap是弱引用不会产生引用计数文章来源地址https://www.toymoban.com/news/detail-481817.html

        let map = new WeakMap();
        let obj = { name: 'zs' };
        map.set(obj, 'zs');
        obj = null;

        console.log(map);

        setTimeout(() => {
            console.log(map);
        }, 1000);

到了这里,关于JS 怎么理解ES6新增Set、Map两种数据结构?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【ES6 Map数据结构】建议日常开发操作数组时使用 new Map

    算法使用 Map 还算是不少的,日常开发也可使用 new Map 替代某些数组操作,活到老学到老 JavaScript的对象 (Object) ,本质上是键值对的集合 (Hash结构) ,但是传统上只能用字符串当作键。这给它的使用带来了很大的限制 为了解决这个问题,ES6提供了Map数据结构。它类似于对

    2024年01月17日
    浏览(45)
  • ES6 全详解 let 、 const 、解构赋值、剩余运算符、函数默认参数、扩展运算符、箭头函数、新增方法,promise、Set、class等等

    ​ ECMAScript 6.0,简称 ES6,是 JavaScript 语言的下一代标准,已经在 2015 年 6 月正式发布了。它的目标,是使得 JavaScript 语言可以用来编写复杂的大型应用程序,成为企业级开发语言 要讲清楚这个问题,需要回顾历史。1996 年 11 月,JavaScript 的创造者 Netscape 公司,决定将 JavaSc

    2024年04月15日
    浏览(46)
  • ES6基础知识七:你是怎么理解ES6中 Generator的?使用场景?

    一、介绍 Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同 回顾下上文提到的解决异步的手段: 回调函数 promise 那么,上文我们提到promsie已经是一种比较流行的解决异步方案,那么为什么还出现Generator?甚至async/await呢? 该问题我们留在后面再

    2024年02月15日
    浏览(44)
  • ES6基础知识六:你是怎么理解ES6中 Promise的?使用场景?

    一、介绍 Promise,译为承诺,是异步编程的一种解决方案,比传统的解决方案(回调函数)更加合理和更加强大 在以往我们如果处理多层异步操作,我们往往会像下面那样编写我们的代码 阅读上面代码,是不是很难受,上述形成了经典的回调地狱 现在通过Promise的改写上面的

    2024年02月15日
    浏览(49)
  • ES6基础知识八:你是怎么理解ES6中Proxy的?使用场景?

    一、介绍 定义: 用于定义基本操作的自定义行为 本质: 修改的是程序默认形为,就形同于在编程语言层面上做修改,属于元编程(meta programming) 元编程(Metaprogramming,又译超编程,是指某类计算机程序的编写,这类计算机程序编写或者操纵其它程序(或者自身)作为它们的

    2024年02月15日
    浏览(35)
  • 你是怎么理解ES6中 Generator的?使用场景?

    Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同 回顾下上文提到的解决异步的手段: 回调函数 promise 那么,上文我们提到 promsie 已经是一种比较流行的解决异步方案,那么为什么还出现 Generator ?甚至 async/await 呢? 该问题我们留在后面再进行

    2024年03月14日
    浏览(47)
  • 你是怎么理解ES6中 Promise的?使用场景?

    Promise ,译为承诺,是异步编程的一种解决方案,比传统的解决方案(回调函数)更加合理和更加强大 在以往我们如果处理多层异步操作,我们往往会像下面那样编写我们的代码 阅读上面代码,是不是很难受,上述形成了经典的回调地狱 现在通过 Promise 的改写上面的代码 瞬

    2024年03月15日
    浏览(59)
  • 你是怎么理解ES6中 Decorator 的?使用场景?

    Decorator,即装饰器,从名字上很容易让我们联想到装饰者模式 简单来讲,装饰者模式就是一种在不改变原类和使用继承的情况下,动态地扩展对象功能的设计理论。 ES6 中 Decorator 功能亦如此,其本质也不是什么高大上的结构,就是一个普通的函数,用于扩展类属性和类方法

    2024年03月11日
    浏览(46)
  • 你是怎么理解ES6中Module的?使用场景?

    模块,(Module),是能够单独命名并独立地完成一定功能的程序语句的集合(即程序代码和数据结构的集合体)。 两个基本的特征:外部特征和内部特征 外部特征是指模块跟外部环境联系的接口(即其他模块或程序调用该模块的方式,包括有输入输出参数、引用的全局变量

    2024年03月12日
    浏览(43)
  • 你是怎么理解ES6中Proxy的?使用场景?

    定义: 用于定义基本操作的自定义行为 本质: 修改的是程序默认形为,就形同于在编程语言层面上做修改,属于元编程 (meta programming) 元编程(Metaprogramming,又译超编程,是指某类计算机程序的编写,这类计算机程序编写或者操纵其它程序(或者自身)作为它们的数据,或

    2024年03月13日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包