【JS ES6】了解学习set类型和weakset类型

news2024/9/29 23:36:31

csdn动态图标

✍️ 作者简介: 前端新手学习中。

💂 作者主页: 作者主页查看更多前端教学

🎓 专栏分享:css重难点教学   Node.js教学 从头开始学习   ajax学习

目录

  • set类型与array和object的区别
  • set元素检测与管理
  • 类型转换的重要性
  • 遍历set类型的方式
  • 使用set处理网站关键字
  • 并集交集差集
  • WeakSet语法介绍
  • 引用类型的垃圾回收原理
  • 列表删除案例

set类型与array和object的区别

set类型跟数组一样可以放多个值,但是set类型中的值不能重复。
数组中的值可以重复

let arr = [1, 2, 2, 1]
console.log(arr);//[ 1, 2, 2, 1 ]

let set = new Set()

set.add(1)
set.add(2)
set.add(1)
set.add(2)
//set有严格类型约束 不同类型不重复
set.add('2')
console.log(set);//Set(3) { 1, 2, '2' }

let set2 = new Set([1, 2, 1, 2, 1, '1'])
console.log(set2);//Set(3) { 1, 2, '1' }

对象对于类型不是很敏感,会将键名转换成字符串,即使键名相同但不同类型,仍然会覆盖。

//对象对于类型不是很敏感  都会解析成字符串键名
let obj = {
    1: 'xiaoixe',
    '1': 'xiaoixetongzhi'
}
console.log(obj);//{ '1': 'xiaoixetongzhi' }
//对象当键名,键名会直接转换成字符串
let obj = {
    1: 'xiaoixe',
    '1': 'xiaoixetongzhi'
}

let xx = {
    [obj]: "小解同志"
}
console.log(typeof (obj));//object
console.log(xx.toString());//[object Object]
console.log(xx);//{ '[object Object]': '小解同志' }
console.log(xx[obj]);//小解同志
console.log(xx['[object Object]']);//小解同志
console.log(xx[obj.toString()]);//小解同志

set元素检测与管理

//获取长度
console.log(set.size);//2

//判断是否包含
console.log(set.has('xiaoxie'));//true
console.log(set.has('xiao'));//false

//删除元素
console.log(set.delete('xiaoxie'));//true 说明删除成功
console.log(set.size);//1

//清空元素
console.log(set.clear());//undefined
console.log(set.size);//0

类型转换的重要性

let set = new Set(['xxtz', 'xiaoxie']);
//转换成数组
console.log(Array.from(set));//[ 'xxtz', 'xiaoxie' ]
console.log([...set]);//[ 'xxtz', 'xiaoxie' ]


//移除大于5的元素
let xx = new Set("123456");
let arr = [...xx].filter((item) => { return item < 5 });
console.log(arr);//[ '1', '2', '3', '4' ]

//数组去重,正好符合set的特性
let arr2 = [1, 2, 3, 4, 5, 1, 2, 3, 4, 5];
console.log([...new Set(arr2)]);//[ 1, 2, 3, 4, 5 ]

遍历set类型的方式

let set = new Set(['xxtz', 'xiaoxie']);
//获取内容值
console.log(set.values());//[Set Iterator] { 'xxtz', 'xiaoxie' }
console.log(set.keys());//[Set Iterator] { 'xxtz', 'xiaoxie' }
console.log(set.entries());//[Set Entries] { [ 'xxtz', 'xxtz' ], [ 'xiaoxie', 'xiaoxie' ] }
//遍历
set.forEach((value, index) => {
    console.log(value, index);//xxtz xxtz
    //xiaoxie xiaoxie
})

for (const iterator of set) {
    console.log(iterator);//xxtz xxtz
    //xiaoxie xiaoxie
}

使用set处理网站关键字

避免重复添加

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        body {
            padding: 200px;
        }

        ul {
            list-style: none;
            padding: 0;
            margin: 0;
            width: 200px;
        }

        li {
            border: 1px solid #000;
            padding: 20px;
        }

        li:nth-of-type(odd) {
            background-color: aquamarine;
        }
    </style>
</head>

<body>
    <input type="text" name="id">
    <ul></ul>
    <script>
        let obj = {
            data: new Set(),
            get keyword() {
                return this.show();
            },
            set keyword(word) {
                this.data.add(word)
            },

            show() {
                let ul = document.querySelector('ul');
                ul.innerHTML = '';
                this.data.forEach(function (value) {
                    ul.innerHTML += `<li>${value}</li>`
                })
            }

        }
        let input = document.querySelector("[name='id']")
        input.addEventListener('blur', function () {
            obj.keyword = this.value
            obj.keyword
        })
    </script>
</body>

</html>

请添加图片描述

并集交集差集

let a = new Set([1, 2, 3, 4, 5,]);
let b = new Set([1, 2, 3]);
// //并集
console.log(new Set([...a, ...b]));

//交集
console.log(new Set(
    [...a].filter(item => b.has(item))
));
//差集
console.log(new Set(
    [...a].filter(item => !b.has(item))
));

WeakSet语法介绍

        //跟set的区别是 WeakSet值需要是引用类型
        let set = new WeakSet()
        //添加内容
        set.add(['xiaoixe', 'xiaoxietongzhi'])
        //添加dom元素
        let nodes = new WeakSet();
        let divs = Array.prototype.slice.call(document.getElementsByTagName("div"));
        divs.forEach(element => {
            nodes.add(element)
        });
        console.log(nodes);//WeakSet {div, div}
        //移除元素
        console.log(nodes.delete(divs[0]), nodes);//true WeakSet {div}
        //不会数组塌陷
        console.log(nodes.has(divs[1]));//true

引用类型的垃圾回收原理

let hd = {
    name: "小解同志"
}
//指向同一个引用地址
let obj = hd
hd = null
//给其中一个变量设置为空,不会影响另一个变量的使用
console.log(obj);
obj = null
//全部为空 开启垃圾回收机制
console.log(obj);
    let hd = {
            name: "小解同志"
        }
        let obj = hd
        let set = new WeakSet()
        //给WeakSet添加内容,WeakSet是弱引用,对象实际上是被 hd obj引用了两次。
        set.add(hd)
        //当我们将obj和hd赋为空的话,对象就该被垃圾回收了
        hd = null
        obj = null
        //对象被垃圾回收后,set并不知道,它还是以为里面有东西,所以还是会显示,但内容已经没有了
        //显示内容后 过段时间,它就会自动清空
        console.log(set)
        setTimeout(() => { console.log(set); }, 2000)

在这里插入图片描述

列表删除案例

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<style>
    .remove {
        opacity: 0.3;
    }

    ul {
        list-style: none;
        padding: 300px;

    }

    ul li {
        border: 1px solid blueviolet;
        background-color: aquamarine;
        padding: 20px;
        text-align: center;
    }
</style>

<body>

    <ul>
        <li>xiaoxie<a href="javascript:;">删除</a></li>
        <li>小解同志<a href="javascript:;">删除</a></li>
        <li>坚毅的小解同志<a href="javascript:;">删除</a></li>
    </ul>
    <script>
        class Todo {
            constructor() {
                this.items = document.querySelectorAll('li')
                console.log(this.items);
                this.lists = new WeakSet(this.items);
                // this.items.forEach(item => {
                //     this.lists.add(item)
                // })
            }
            run() {
                this.addEvent()
            }
            addEvent() {
                this.items.forEach(item => {
                    item.querySelector('a').addEventListener("click", event => {
                        const parentElement = event.target.parentElement;
                        if (this.lists.has(parentElement)) {
                            parentElement.classList.add('remove');
                            this.lists.delete(parentElement);
                        } else {
                            alert('todo 已经删除')
                        }
                    })
                })
            }
        }
        new Todo().run()
    </script>
</body>

</html>

请添加图片描述

weakSet 适用于临时存放一组对象,以及存放和对象绑定的信息,只要这些对象在外部消失,那么它在 weakset 里面的引用也会自动消失,类似单向绑定。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/96451.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring - 事件监听机制 源码解析

文章目录Pre概述ApplicationEvent ------ 事件ApplicationListener ------ 事件监听器ApplicationEventPublisher ------ 事件发布者ApplicationEventMulticaster ------ 事件广播器spring主要的内置事件ContextRefreshedEventContextStartedEventContextStoppedEventContextCl…

设计模式概述之单例模式(四)

很多小伙伴&#xff0c;不知道设计模式是什么&#xff1f; 通常我们所说的设计模式是一种设计方案&#xff0c;是前人留下的经验及最佳实践。 想要学习设计模式&#xff0c;至少要把面向对象的基本结构全部了解。 设计模式&#xff0c;是建立在一定基础上的思维训练。 学习…

喜报 | 中关村发来贺电

2022年12月14日&#xff0c;由中关村金融科技产业发展联盟、中关村互联网金融研究院举办的“中关村金融科技系列活动——2023第十届中关村金融科技论坛年会暨2022“光大杯”中关村番钛客金融科技国际创新大赛颁奖典礼”已圆满落幕。本次会议为建设金融科技中心&#xff0c;共建…

【Pintos】实现自定义 UserProg 系统调用

&#x1f4ad; 写在前面&#xff1a;本文讲解的内容不属于 Pintos 的 Project 项目&#xff0c;而是关于 userprog 如何添加系统调用的&#xff0c;学习如何额外实现一些功能到系统调用中以供用户使用。因为涉及到 src/example 下的Makefile 的修改、lib 目录下 syscall-nr 系统…

搜索二叉树详解

&#x1f9f8;&#x1f9f8;&#x1f9f8;各位大佬大家好&#xff0c;我是猪皮兄弟&#x1f9f8;&#x1f9f8;&#x1f9f8; 文章目录一、搜索二叉树框架二、搜索二叉树概念三、搜索二叉树操作①Erase②Find递归③Insert递归④Erase递归&#xff0c;比Erase更简洁⑤析构函数⑥…

unity学习笔记--day01

今天学习制作了一个简单的抽卡功能&#xff0c;学习结束后目录结构如下&#xff1a; .mate文件是unity生成的配置文件&#xff0c;不用管 制作第一张卡片 创建一个空物体&#xff0c;改名为Card。 在Card下挂载以下UI组件&#xff1a; 编写数据脚本并挂载&#xff0c;unity采用…

Nginx教程(4)—Keepalived

文章目录4.1 高可用集群架构Keepalived双机主备原理4.2 安装Keepalived4.3 Keepalived核心配置文件4.4 Keepalived实现双主机主备高可用测试4.5 高可用集群架构Keepalived双主热备原理Nginx教程一 Nginx教程二 Nginx教程三 4.1 高可用集群架构Keepalived双机主备原理 我们知道…

【计算机毕业设计】78.汽车租赁系统源码

一、系统截图&#xff08;需要演示视频可以私聊&#xff09; 目 录 摘 要 前 言 第1章 概述 1.1 研究背景 1.2 研究目的 1.3 研究内容 第二章 开发技术介绍 2.1 Java技术 2.2 Mysql数据库 2.3 B/S结构 2.4 SSM框架 第三章 系统分析 3.1 可行性分析 3.1.1 技术…

UnrealUBlueprintAsyncActionBase的使用

实现异步调用&#xff0c;之前我们介绍过一种FLatentActionInfo的方法&#xff0c;还有另外一种UBlueprintAsyncActionBase方法&#xff0c;可以实现异步节点&#xff0c;用于异步监听然后进行回调。按照如下步骤进行使用&#xff0c;我们同样以Delay一定帧数&#xff0c;并每帧…

面对新技术,必须找到与其发展相辅相成的长期主义的方法

从Meta股价的一路走低到扎克伯格发布的头显并不被用户买账&#xff0c;Facebook全力拥抱Meta正在经历一场过山车。   扎克伯格和他所带领下的Meta遭遇到的如此多的困境和难题&#xff0c;越来越多地让我们开始相信&#xff1a;所谓的元宇宙并非是一蹴而就的&#xff0c;它是一…

【云原生 Kubernetes】基于 Minikube 搭建第一个k8s集群

一、前言 对于k8s来说&#xff0c;搭建方式有多种&#xff0c;如果是生产环境&#xff0c;一般来说&#xff0c;至少需要3台节点确保服务的高可用性&#xff0c;常用的搭建方式列举如下&#xff08;提供参考&#xff09;&#xff1a; kubeadm搭建&#xff08;推荐&#xff09; …

postman测试环境的创建及发送请求方式

目录 一、创建工作环境 1、打开postman&#xff0c;点击工作区 2、点击新建 3、添加名字&#xff0c;点击创建 4、工作区可以自由切换工作区 5、点击创建发送请求 6、更换请求方式 7、保存测试 二、测试发送请求&#xff0c;使用的时候服务一定要启动 1、普通传参&…

C++ 类型转换

目录 C语言中的类型转换 为什么C需要四种类型转换 C&#xff1a;命名的强制类型转换 static_cast reinterpret_cast const_cast dynamic_cast C语言中的类型转换 在C语言中&#xff0c;如果赋值运算符左右两侧类型不同&#xff0c;或者形参与实参类型不匹配&#xff0c…

信息学奥赛一本通——1163:阿克曼(Ackmann)函数

文章目录1163&#xff1a;阿克曼(Ackmann)函数【题目描述】【输入】【输出】【输入样例】【输出样例】分析代码1163&#xff1a;阿克曼(Ackmann)函数 时间限制:1000ms内存限制:65536KB提交数:24804通过数:20247时间限制: 1000 ms 内存限制: 65536 KB 提交数: 24804 通过数: 202…

第三十章 linux-模块的文件格式与EXPORT_SYMBOL的实现

第三十章 linux-模块的文件格式与EXPORT_SYMBOL的实现 文章目录第三十章 linux-模块的文件格式与EXPORT_SYMBOL的实现模块的文件格式EXPORT_SYMBOL的实现模块的文件格式 以内核模块形式存在的驱动程序&#xff0c;比如demodev.ko&#xff0c;其在文件的数据组织形式上是ELF&am…

数据结构---快速排序

快速排序分治法思想基准元素的选择元素交换双边循环法JAVA实现单边循环法JAVA实现快速排序也是从冒泡排序演化而来使用了 分治法&#xff08;快的原因&#xff09;快速排序和冒泡排序共同点&#xff1a;通过元素之间的比较和交换位置来达到排序的目的。 快速排序和冒泡排序不同…

JavaWeb核心:HTTPTomcatServlet

HTTP 概念: Hyper Text Transfer Protocol&#xff0c;超文本传输协议&#xff0c;规定了浏览器和服务器之间数据传输的规则。 HTTP-请求数据格式 HTTP-响应数据格式 响应状态码的大的分类 常见的响应状态码 Tomcat 简介 概念: Tomcat是Apache 软件基金会一个核心项目&#…

【云原生】Prometheus 自定义告警规则

文章目录一、概述二、告警实现流程三、告警规则1&#xff09;告警规则配置1&#xff09;监控服务器是否在线3&#xff09;告警数据的状态四、实战操作1&#xff09;下载 node_exporter2&#xff09;启动 node_exporter3&#xff09;配置Prometheus加载node_exporter4&#xff0…

这样也可以让图像正向扩散

🍿*★,*:.☆欢迎您/$:*.★* 🍿 怎样的扩散取决于b是不是随机噪声 是随机噪声 则是扩散模型 如stable diffision 如果是非噪声则是方向模型 方向模型是指 在已知几个连续的输入 后可以通过模型的辅助预测扩散的方向 而 stable diffision 是通过预测反扩散方向 本质就…

VS2017中OpenCV编程插件Image Watch安装和使用介绍

安装 下载适合vs2017最新版本的Image Watch(ImageWatch.vsix)&#xff0c;下载地址 安装ImageWatch&#xff0c;双击ImageWatch.vsix进行安装即可&#xff1b; 使用 打开一个OpenCV工程&#xff0c;在Debug下设置断点&#xff0c;通过view -> other windows -> Image W…