总结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

相关文章

Kubernetes常用命令大全近期总结

《Kubernetes常用命令大全近期总结》Kubernetes是用于大规模部署和管理这些容器的开源软件-在希腊语中,这个词还有“舵手”或“飞行员”的意思,使用Kubernetes(有时被称为“... 目录前言Kubernetes 的工作原理为什么要使用 Kubernetes?Kubernetes常用命令总

Python中实现进度条的多种方法总结

《Python中实现进度条的多种方法总结》在Python编程中,进度条是一个非常有用的功能,它能让用户直观地了解任务的进度,提升用户体验,本文将介绍几种在Python中实现进度条的常用方法,并通过代码... 目录一、简单的打印方式二、使用tqdm库三、使用alive-progress库四、使用progres

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

Java向kettle8.0传递参数的方式总结

《Java向kettle8.0传递参数的方式总结》介绍了如何在Kettle中传递参数到转换和作业中,包括设置全局properties、使用TransMeta和JobMeta的parameterValu... 目录1.传递参数到转换中2.传递参数到作业中总结1.传递参数到转换中1.1. 通过设置Trans的

C# Task Cancellation使用总结

《C#TaskCancellation使用总结》本文主要介绍了在使用CancellationTokenSource取消任务时的行为,以及如何使用Task的ContinueWith方法来处理任务的延... 目录C# Task Cancellation总结1、调用cancellationTokenSource.

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的

poj 3050 dfs + set的妙用

题意: 给一个5x5的矩阵,求由多少个由连续6个元素组成的不一样的字符的个数。 解析: dfs + set去重搞定。 代码: #include <iostream>#include <cstdio>#include <set>#include <cstdlib>#include <algorithm>#include <cstring>#include <cm

二分最大匹配总结

HDU 2444  黑白染色 ,二分图判定 const int maxn = 208 ;vector<int> g[maxn] ;int n ;bool vis[maxn] ;int match[maxn] ;;int color[maxn] ;int setcolor(int u , int c){color[u] = c ;for(vector<int>::iter