总结Symbol、Set、WeakSet、Map、WeakMap

2024-01-23 13:36

本文主要是介绍总结Symbol、Set、WeakSet、Map、WeakMap,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

        这几个es6+新增的数据结构和变量类型,不经常用,好容易忘记啊。在此记录一下,方便复习。

Symbol

        Symbol是es6新增的基本数据类型,用于生成独一无二的值。

  基本使用

1、创建两个描述相同的值,也不会相等。

let s1 = Symbol(1)
let s2 = Symbol(1)
s1 !==s2 //true

2、s1.description获得描述

let s1= Symbol(‘描述’) 
s1.description//‘描述’ 
//描述可以是字符串或数字,最终都会转为字符串

3、用做对象的属性

  • 添加Symbol属性,需要使用方括号
let sym = Symbol(11);
let o = {};
o[sym] = 11;
//不能在字面量对象中直接添加Symbol属性
/*
{Symbol(11):11 //这样会报错[sym] : 11 //这样就不会报错}
*/

  • 因为Symbol会生成独一无二的值,所以用相同描述创建两个Symbol变量后,就可以添加到对象上,还不会覆盖掉。
let obj = {age:18}
let s1 = Symbol(JSON.stringify(obj))
let s2 = Symbol(JSON.stringify(obj))//测试开始
let showObj={}
showObj[s1] = 1
showObj[s2] = 2console.log(showObj)/*{Symbol({"age":18}): 1Symbol({"age":18}): 2}*/

  • 对象的Symbol属性用Object.keys()等遍历不到,需要使用Object.getOwnPropertySymbols()
Object.getOwnPropertySymbols( obj )//这是单独获取对象自身上的Symbol键的名

4、Symbol.key('描述') 使 “相同描述的Symbol变量”相等

const s1 = Symbol.for(1)
const s2 = Symbol.for(1)
console.log(s1 === s2)//true
console.log(Symbol.keyFor(s1)) //1

可以通过Symbol.keyFor()和description拿到描述。

新增的数据结构

Set

类似数组,但是元素不能重复。(重复的话是删除后面的元素)

创建

//方式1
let set1 = new Set([2,3,4,4,4]) //会去除重复的4//方式2
let set2 = new Set()
s2.add(2)
s2.add(3)
s2.add(4)

Set变量是类数组,转为真正的数组可以借助Array.from()或[...s1] 

常用方法与属性

1、添加元素
s1.add(元素)
2、删除指定元素,不支持索引
s1.delete(元素)
3、清空整个set
s1.clear()
4、遍历

能用forEach和forof遍历,forin遍历无效。

let set = new Set(['a','b','c']);
set.forEach((value,index) => {console.log(value,index); //value等于index
});

5、判断是否包含这个元素
s1.has(元素)

6、s1.size得到set长度

let s1 = new Set([1,2,3])
s1.size //3

WeakSet

WeakSet与Set区别

  • WeakSet只能存放引用类型(object、array、function)的元素,不能存放基本数据类型(number、string、Boolean、undefinend、null、Symbol、BigInt);

  • WeakSet对元素的引用是弱引用,即当其元素没有其他引用指向他时随时会被垃圾回收(WeakSet对其元素的引用不进行计数)

  • weakSet不能清空和遍历,因为弱引用。

WeakSet的应用

一个类的方法只允许new出来的对象进行调用,而不允许显示绑定的this去调用。 

const weakSet1 = new WeakSet()
class Person{constructor(){weakSet1.add(this)//在new时将this放入WeakSet中存储起来}eating(){if(weakSet1.has(this)){//在实例方法中判断调用该方法时this是否在new的对象中。//要執行的邏輯}}
}

因为WeakSet对其变量是弱引用,Person实例没在其他地方使用时,WeakSet变量就会被回收掉。

Map

存储映射关系,类似二维数组。

创建

在new Map时传入二维数组,对于相同的key,后者覆盖前者。

可以通过set方法添加映射关系。

m1.set({name:'sa'},'值')	//	尾插元素

常用方法与属性

1、m1.get(key) 获取key对应的值

2、m1.has(key) 判断有无key

3、m1.delete(key) 删除key的映射

4、m1.clear() 清空m1

let obj = {age:18}
let m1 = new Map([[obj,18],['name','xiaomi']])
m1.get(obj)	//	获取key对应的值。18m1.has(obj)	//判断这个key是否在m1 Map中m1.delete(obj) //删除key的映射m1.clear() //清空

遍历

用forEach或者forof,同样forin无效。

WeakMap

Map和WeakMap区别

  • weakmap只能用引用类型变量作为key【属性名】

  • weakmap对键是弱引用对值是强引用。(所以适合用对象作为键的情况)

  • 弱引用,所以不能遍历。也没有size和clear()

WeakMap的应用

1、存储缓存结果,而不用担心内存泄漏 。(深拷贝中存储之前的结果用以解决循环引用的问题)

let cache = new WeakMap();function compute(obj) {if (cache.has(obj)) {return cache.get(obj);} else {let result = /* 基于obj计算出一个结果 */;cache.set(obj, result);return result;}
}

2、存储dom节点的元数据,而不用担心内存泄漏

const m1= new WeakMap();
const el= document.getElementById('id');
m1.set(el, '元数据');
m1.get(el) //domx消失,存储的数据也消失

 

END

         WeakMap和WeakSet可以解决某些内存泄漏的问题。

        Map有get和set方法,而Set直接存值,并且没有索引,所以没有get方法,只有add方法(set有需要可以转数组后使用)。

这篇关于总结Symbol、Set、WeakSet、Map、WeakMap的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/636576

相关文章

C# List.Sort四种重载总结

《C#List.Sort四种重载总结》本文详细分析了C#中List.Sort()方法的四种重载形式及其实现原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录1. Sort方法的四种重载2. 具体使用- List.Sort();- IComparable

SpringBoot项目整合Netty启动失败的常见错误总结

《SpringBoot项目整合Netty启动失败的常见错误总结》本文总结了SpringBoot集成Netty时常见的8类问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一、端口冲突问题1. Tomcat与Netty端口冲突二、主线程被阻塞问题1. Netty启动阻

SpringBoot整合Kafka启动失败的常见错误问题总结(推荐)

《SpringBoot整合Kafka启动失败的常见错误问题总结(推荐)》本文总结了SpringBoot项目整合Kafka启动失败的常见错误,包括Kafka服务器连接问题、序列化配置错误、依赖配置问题、... 目录一、Kafka服务器连接问题1. Kafka服务器无法连接2. 开发环境与生产环境网络不通二、序

python3中正则表达式处理函数用法总结

《python3中正则表达式处理函数用法总结》Python中的正则表达式是一个强大的文本处理工具,用于匹配、查找、替换等操作,在Python中正则表达式的操作主要通过内置的re模块来实现,这篇文章主要... 目录前言re.match函数re.search方法re.match 与 re.search的区别检索

Java Map排序如何按照值按照键排序

《JavaMap排序如何按照值按照键排序》该文章主要介绍Java中三种Map(HashMap、LinkedHashMap、TreeMap)的默认排序行为及实现按键排序和按值排序的方法,每种方法结合实... 目录一、先理清 3 种 Map 的默认排序行为二、按「键」排序的实现方式1. 方式 1:用 TreeM

C++中unordered_set哈希集合的实现

《C++中unordered_set哈希集合的实现》std::unordered_set是C++标准库中的无序关联容器,基于哈希表实现,具有元素唯一性和无序性特点,本文就来详细的介绍一下unorder... 目录一、概述二、头文件与命名空间三、常用方法与示例1. 构造与析构2. 迭代器与遍历3. 容量相关4

Python版本与package版本兼容性检查方法总结

《Python版本与package版本兼容性检查方法总结》:本文主要介绍Python版本与package版本兼容性检查方法的相关资料,文中提供四种检查方法,分别是pip查询、conda管理、PyP... 目录引言为什么会出现兼容性问题方法一:用 pip 官方命令查询可用版本方法二:conda 管理包环境方法

Redis中Set结构使用过程与原理说明

《Redis中Set结构使用过程与原理说明》本文解析了RedisSet数据结构,涵盖其基本操作(如添加、查找)、集合运算(交并差)、底层实现(intset与hashtable自动切换机制)、典型应用场... 目录开篇:从购物车到Redis Set一、Redis Set的基本操作1.1 编程常用命令1.2 集

pycharm跑python项目易出错的问题总结

《pycharm跑python项目易出错的问题总结》:本文主要介绍pycharm跑python项目易出错问题的相关资料,当你在PyCharm中运行Python程序时遇到报错,可以按照以下步骤进行排... 1. 一定不要在pycharm终端里面创建环境安装别人的项目子模块等,有可能出现的问题就是你不报错都安装

Python中logging模块用法示例总结

《Python中logging模块用法示例总结》在Python中logging模块是一个强大的日志记录工具,它允许用户将程序运行期间产生的日志信息输出到控制台或者写入到文件中,:本文主要介绍Pyt... 目录前言一. 基本使用1. 五种日志等级2.  设置报告等级3. 自定义格式4. C语言风格的格式化方法