iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >ES6中Set与WeakSet集合实例分析
  • 627
分享到

ES6中Set与WeakSet集合实例分析

2023-06-17 10:06:25 627人浏览 泡泡鱼
摘要

这篇文章主要讲解了“es6中Set与WeakSet集合实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ES6中Set与WeakSet集合实例分析”吧!Set是值永不重复的特殊集合每天都

这篇文章主要讲解了“es6中Set与WeakSet集合实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ES6中Set与WeakSet集合实例分析”吧!

    Set是值永不重复的特殊集合

    每天都用数组,有没有过一个Moment,担心插入了重复的值?使用Set集合吧!Set拥有特殊的数据结构,保证插入的值永远不会重复。

    Set集合基础api

    通过Set.prototype.constructor 构造函数创建Set实例

     let empty_set = new Set()     let transfer_set4arr = new Set([1, 2, 3])// 返回Set(3) {1, 2, 3}let transfer_set4string = new Set("huilin")// 返回Set(5) {"h", "u", "i", "l", "n"}let transfer_set4set = new Set(new Set([5, 6]))// 返回Set(2) { 5, 6 }

    访问 Set.prototype.size属性,返回集合中元素的个数

    console.log(empty_set.size) // 0console.log(transfer_set4arr.size)  // 3

    调用 Set.prototype.has(value) 方法,判断元素是否存在

    // 相比起Array.includes(),Set.has()性能更高,因为专门对成员测试进行了优化console.log(empty_set.has(1))   // falseconsole.log(transfer_set4arr.has("h")) // true

    关于唯一值的判断

    • Set集合为确保值的唯一性,使用Object.is(value1,value2)进行判断,而不是通过===(恒等符号)符号来判断的,因为恒等判断会将两边的变量进行强制类型转换。

    • 比如,两个变量的值均为NaN,或者0和-0,用js判断是不相等的,但Object.is()认为是同一个只,因此不能存入Set集合中。

    想了解更多关于Object.is(),请跳转查看:developer.mozilla.org/zh-CN/docs/…

    let n1 = NaNlet n2 = NaNconsole.log(n1 === n2)  // 恒等符号判断两者不一致,输出falseconsole.log(Object.is(n1,n2)) // 但Object.is()判断两者是相同的,输出false// Set集合不允许将两个NaN放入集合let set = new Set()set.add(n1).add(n2)console.log(set.size)   // size: 1

    而面对复杂数据类型时,主要通过对象的引用进行判断。引用不一致,即便数据结构一致,也认为只不相同,因此能存入Set集合。

    let same_value_set = new Set();// 先存入一个对象same_value_set.add({num: 0});// 再存入一个结构一致的新对象let obj = {num: 0};same_value_set.add(obj);// 都能存入成功console.log(same_value_set.size); // 2

    调用Set.prototype.add(value) 方法,向集合追加数据

    // add()方法可以追加任意类型的数据,不论是原始值或者是对象引用let set1 = new Set()// 由于add()方法始终返回当前实例的引用,所以进行链式调用set1.add(1).add(2).add(3)console.log(set1) // Set(3) {1, 2, 3}// 注意:当add()传入数组时,Set会将数组实例插入集合,而不是数组内的元素set1.add([4, 5])console.log(set1) // Set(4) {1, 2, 3, [4, 5]}

    调用Set.prototype.delete(value) 方法,移除集合中的元素

    // delete()方法返回移除操作是否成功,与.has()方法一样let success = set1.delete(1)console.log(success)// true

    调用Set.prototype.clear() 方法,清空集合

    let num_set = new Set([1, 6, 3])console.log(num_set)// Set(3) { 1, 6, 3 }set1.clear()console.log(num_set)// Set(0) {}

    Set集合遍历的3种方式

    由于集合没有下标/索引,通常被认为是“无序集合”。但javascript会记住元素插入的顺序,所以遍历的时候也按顺序对元素进行迭代。

    直接遍历Set集合

    let set = new Set([1, 2, 3, 4, 5])for(let item of set){    console.log(item)}// 依次输出:1 2 3 4 5

    创建迭代器进行遍历

     // Set集合只有value而没有key,但为了使得和遍历Map对象相似,Set.entries()创建新的Iterator对象时,每一项的键和值都相等,即[value,value]for(let [key,value] of set.entries()){    console.log(value)}// 依次输出:1 2 3 4 5// Set.keys()创建新的Iterator对象,返回每一项值for(let key of set.keys()){    console.log(key)}// 依次输出:1 2 3 4 5// Set.values()和Set.keys()一致,返回每一项的值for(let value of set.values()){    console.log(value)}// 依次输出:1 2 3 4 5

    调用Set.prototype.forEach(callbackFn)方法遍历

    // forEach(callbackFn) 按照插入顺序调用callbackFn,取出每项值set.forEach(item => {    console.log(item)})// 依次输出:1 2 3 4 5

    Set集合案例实践

    Set集合与Array数组之间的转换

    let set1 = new Set([1, 2, 3])// Array.from()方法let arr1 = Array.from(set1)  // 扩展运算符let arr2 = [...set1]   // 利用Set构造函数let set = new Set(array)

    单个数组去重

    let set = new Set([1, 2, 4, 4, 2, 5])console.log(set)// Set(4) { 1, 2, 4, 5 }

    多个数组合并去重

    let arr1 = [1, 2, 4]let arr2 = [1, 5, 6]// 利用Set集合的特性,集合内的元素都是唯一的let result = new Set([...set1, ...set2]) console.log(result)// Set(5) { 1, 2, 4, 5, 6 }

    获取交集(重复的元素)

    let set1 = new Set([1, 2, 4])let set2 = new Set([1, 5, 6])// 返回set1和set2都存在的元素let result = new Set([...set1].filter(x => set2.has(x))) console.log(result)// Set(1) { 1 }

    判断是否有交集(重复的元素)

    let set1 = new Set([1, 2, 4])let set2 = new Set([1, 5, 6])function isMixed(set, subset) {    for (let elem of subset) {        if (set.has(elem)) {            return true;        }    }    return false;}console.log(isMixed(set1, set2))// true

    获取差集:只返回重复

    let set1 = new Set([1, 2, 4])let set2 = new Set([1, 5, 6])function difference(setA, setB) {    let result = new Set()    for (let elem of setB) {        if(setA.has(elem)){            result.add(elem)        }    }    return result;}console.log(difference(set1, set2))

    WeakSet“弱”在哪里?

    除了Set集合外,ES6还提供了WeakSet和WeakMap。既然集合的名字都叫“Weak(弱)的集合”了,究竟它“弱”在哪里呢?

    弱功能

    WeakSet不允许插入原始值,仅支持对象的引用;

    let val1 = {id: 1},    val2 = {id: 2}let ws = new WeakSet()// 和Set集合一样,WeakSet的值也不重复,同时add()也返回集合实例,所以可以链式操作ws.add(val1).add(val1).add(val2)// 不允许插入基础数据类型ws.add(3)// 报错:TypeError:Invalid value used in WeakSet// 但可以先包装成对象后再插入let val3 = new Number(3)ws.add(val3)console.log(ws.has(val3))// 输出:true
    • WeakSet仅实现了add()、has()、delete()三个操作方法;

    • WeakSet不允许遍历,也没有size或者length属性;

    弱引用

    要说弱引用,先看看什么是强引用:

    // 声明一个对象let handsome = {    name: "huilin",    age: 30}// 放入数组let arr = [1, handsome, 2]console.log("release before arr length", arr.length) // 3// 放入Maplet user = {    oid: 10001,    classify: "Chinese",    staffReference: handsome}console.log("release before map length", Object.keys(user).length) // 3console.log("----")// 突然把对象置为nullhandsome = null// 强引用的容器中,对象仍然存在没有被回收console.log("release after arr length", arr.length) // 3console.log(arr[1]) // { name: "huilin", age: 30 }console.log("release after map length", Object.keys(user).length) // 3console.log(user.staffReference) // { name: "huilin", age: 30 }

    从测试代码看出,除非容器销毁,否则引用的对象一直没有被回收。而所谓弱引用,就是希望容器是根据元素自动伸缩的,一旦对象为null,容器中的引用也跟着回收。

    let obj1 = {    name: "huilin",    age: 30}let obj2 = {    name: "cc",    age: 29}let ws1 = new WeakSet()ws1.add(obj1).add(obj2)console.log(ws1.has(obj1))  // true// 不管是从容器操作元素ws1.delete(obj1)console.log(ws1.has(obj1))  // false// 或者是对象自己置为null,都会自动回收obj2 = nullconsole.log(ws1.has(obj2))  // false

    感谢各位的阅读,以上就是“ES6中Set与WeakSet集合实例分析”的内容了,经过本文的学习后,相信大家对ES6中Set与WeakSet集合实例分析这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

    --结束END--

    本文标题: ES6中Set与WeakSet集合实例分析

    本文链接: https://www.lsjlt.com/news/288180.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • ES6中Set与WeakSet集合实例分析
      这篇文章主要讲解了“ES6中Set与WeakSet集合实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ES6中Set与WeakSet集合实例分析”吧!Set是值永不重复的特殊集合每天都...
      99+
      2023-06-17
    • ES6中Set与WeakSet集合详细介绍
      这篇文章主要讲解了“ES6中Set与WeakSet集合详细介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ES6中Set与WeakSet集合详细介绍”吧!目录Set是值永不重复的特殊集合S...
      99+
      2023-06-20
    • ES6中Set与WeakSet集合的深入讲解
      目录Set是值永不重复的特殊集合Set集合基础API关于唯一值的判断Set集合遍历的3种方式Set集合案例实践Set集合与Array数组之间的转换单个数组去重多个数组合并去重获取交集...
      99+
      2022-11-12
    • ES6中集合set的示例分析
      这篇文章给大家分享的是有关ES6中集合set的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。集合set新的数据结构Set(集合),它类似于数组,成员的值都是唯一的,集合实...
      99+
      2022-10-19
    • javascript ES6中set集合、map集合使用方法详解与源码实例
      set与map理解 ES6中新增,set集合和map集合就是一种数据的存储结构(在ES6之前数据存储结构只有array,object),不同的场景使用不同的集合去存储数据 set集合...
      99+
      2022-12-10
      javascript ES6中set集合 map集合使用方法详解与源码实例 JS ES6中set集合使用方法 JS ES6中map集合使用方法
    • ES6中Map集合的示例分析
      这篇文章将为大家详细讲解有关ES6中Map集合的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Map集合类似于对象,也是键值对的集合,但是 键 不限于字符串,各种...
      99+
      2022-10-19
    • ES6的Set、Map、Symbol实例分析
      这篇文章主要介绍“ES6的Set、Map、Symbol实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“ES6的Set、Map、Symbol实例分析”文章能帮助大家解决问题。Set  ...
      99+
      2023-06-17
    • ES6中怎么使用Map与Set集合
      这期内容当中小编将会给大家带来有关ES6中怎么使用Map与Set集合,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。集合的概念以及和数组的区别其实数组也是集合, 只不过数组...
      99+
      2022-10-19
    • ES6中如何使用Map与Set集合
      本篇内容主要讲解“ES6中如何使用Map与Set集合”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ES6中如何使用Map与Set集合”吧!集合的概念以及和数组的区别其实数组也是集合, 只不过数组...
      99+
      2023-06-17
    • Python中的Set与dict实例分析
      这篇文章主要讲解了“Python中的Set与dict实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python中的Set与dict实例分析”吧!一、Set 集合类型Set 集合类型 ...
      99+
      2023-06-29
    • JavaScript弱映射与弱集合实例分析
      这篇文章主要介绍“JavaScript弱映射与弱集合实例分析”,在日常操作中,相信很多人在JavaScript弱映射与弱集合实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解...
      99+
      2022-10-19
    • JavaScript字典与集合应用实例分析
      这篇文章主要介绍“JavaScript字典与集合应用实例分析”,在日常操作中,相信很多人在JavaScript字典与集合应用实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解...
      99+
      2022-10-19
    • 如何分析python中集合set的函数
      这篇文章的内容主要围绕如何分析python中集合set的函数进行讲述,文章内容清晰易懂,条理清晰,非常适合新手学习,值得大家去阅读。感兴趣的朋友可以跟随小编一起阅读吧。希望大家通过这篇文章有所收获!s={ x1,x2,x3.....};集合...
      99+
      2023-06-26
    • ES6中Set和Map数据结构的示例分析
      这篇文章主要介绍了ES6中Set和Map数据结构的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。ES6 的 Set:ES6 提供了新...
      99+
      2022-10-19
    • 如何分析python中字典dict和集合set
      今天就跟大家聊聊有关如何分析python中字典dict和集合set,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1.字典字典是python中的一种数据结构。它的内容由**键-值(ke...
      99+
      2023-06-22
    • Python集合与字典数据类型实例分析
      这篇文章主要讲解了“Python集合与字典数据类型实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python集合与字典数据类型实例分析”吧!前言集合数据类型是没有顺序的简单对象的聚集...
      99+
      2023-06-29
    • Java集合ArrayDeque类实例分析
      Java集合ArrayDeque类实例分析前言ArrayDeque类是双端队列的实现类,类的继承结构如下面,继承自AbastractCollection(该类实习了部分集合通用的方法,其实现了Collection接口),其实现的接口Dequ...
      99+
      2023-05-31
      java arraydeque ava
    • python中集合的示例分析
      这篇文章主要介绍python中集合的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、集合的基本信息集合:集合是无序的,集合中的元素是唯一的,集合一般用于元组或者列表中的元素去重。格式:set1 = set(...
      99+
      2023-06-15
    • Java中集合的示例分析
      小编给大家分享一下Java中集合的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!java集合java集合类存放于java.util包中,是一个用来存放对象...
      99+
      2023-06-20
    • Java Map集合使用实例分析
      这篇文章主要讲解了“Java Map集合使用实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java Map集合使用实例分析”吧!Map接口   ...
      99+
      2023-06-30
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作