set、map、WeakSet和WeakMap的区别
程序员文章站
2022-06-12 21:42:24
...
set(集合)
set和map主要用于 数据重组 和 数据存储,set是集合的数据结构,map是字典的数据结构;set是ES6新增的一种新的数据结构,类似于数组,但是成员唯一且无序,没有重复的值;set对象允许你存储任何类型的唯一值,无论是原始值或是对象的引用。且本身就是一种构造函数,用于生成set数据结构
var sett = new Set(); //Object
sett.add(2)
console.log(sett.length,'--',sett.size) // undefined 1
// size为元素个数
[1,2,3,4,5].forEach(i=>sett.add(i))
console.log(sett) // [2,1,3,4,5] 输出只会有一个2
Set实例方法有:
- 操作方法
- add:新增,相当于数组操作的push
- delete: 存在即删除
- has:判断集合中是否存在
- clear: 清空集合
- 遍历方法
- keys():返回一个包含集合中所有键的迭代器
- value(): 返回一个包含集合中所有值的迭代器
- entries():返回一个包含Set对象中所有元素的键值对迭代器
- forEach(callbackFn,thisArg): 用于对集合成员callbackFn操作,若有thisArg,则回调中的this为它,没有返回值
WeakSet
可将若对象存储在一个集合中
与Set的区别主要在于:
- WeakSet只能存储对象引用,不能存放值,而Set对象可以
- WeakSet对象中存储的对象值都是被弱引用的,对象会被垃圾回收掉。WeakSet对象中元素取决于垃圾回收机制有没有运行,运行前后可能会不一致。WeakSet对象无法被遍历,不能拿到它包含的所有元素
- WeakSet的实例方法主要有:
add(value):在对象中添加一个元素value
has(value):判断WeakSet对象中是否包含value
delete(value):删除元素value
Map(字典)
map 对象保存键值对,任何值都可以作为一个键或一个值
集合与字典的区别:
共同点:集合、字典 可以存储不重复的值
不同点:集合是以[value,value]的形式存储元素;字典是以[key,value]的形式存储
map的实例方法:
- 操作方法:
set(key,value):向字典中添加元素
get(key):通过键查找特定你的数值并返回
has(key):判断字典中是否存在减key
delete(key):通过键key删除字典对应的数据
clear():删除字典中所有元素 - 遍历方法
Keys():将字典中包含的所有键名一迭代器形式返回
values():将字典中包含的所有数值以迭代器形式返回
entries():返回所有成员的迭代器
forEach():遍历字典的所有成员 - map与其他数据结构的相互转换
// 1. Map 转 Array
const map = new Map([
[1, 1],
[2, 2],
[3, 3]
])
console.log([...map]) // [[1, 1], [2, 2], [3, 3]]
//2. Array 转 Map
const map = new Map([
[1, 1],
[2, 2],
[3, 3]
])
console.log(map) // Map {1 => 1, 2 => 2, 3 => 3}
//3. Map 转 Object
function mapToObj(map) {
let obj = Object.create(null)
for (let [key, value] of map) {
obj[key] = value
}
return obj
}
const map = new Map().set('name', 'An').set('des', 'JS')
mapToObj(map) // {name: "An", des: "JS"}
//4. Object 转 Map
function objToMap(obj) {
let map = new Map()
for (let key of Object.keys(obj)) {
map.set(key, obj[key])
}
return map
}
objToMap({
'name': 'An',
'des': 'JS'
}) // Map {"name" => "An", "des" => "JS"}
//5. Map 转 JSON
function mapToJson(map) {
return JSON.stringify([...map])
}
let map = new Map().set('name', 'An').set('des', 'JS')
mapToJson(map) // [["name","An"],["des","JS"]]
//6. JSON 转 Map
function jsonToStrMap(jsonStr) {
return objToMap(JSON.parse(jsonStr));
}
jsonToStrMap('{"name": "An", "des": "JS"}') // Map {"name" => "An", "des" => "JS"}
WeakMap
WeakMap 对象是一组键值对的集合,其中键是弱引用对象,值是可以任意。WeakMap弱引用的只是键名,键值依然是正常引用。
实例方法有:
- has(key):判断是否有key关联对象
- get(key):返回key关联对象,没有则返回undefined
- set(key):设置一组可以关联对象
- delete(key):移除key的关联对象
总结:
- set
成员唯一、无序且不重复
[value,value],键值与键名是一致的(或者说只有键值,没有键名)
可以遍历
方法有:add、delete、has、clear - WeakSet
成员都是对象
成员都是弱引用,可以被垃圾回收机制回收,可以用来保存DOM节点,不容易造成内存泄漏
不能遍历
方法有:add、delete、has - Map
本质上是键值对的集合,类似集合
可以遍历
方法主要有:操作方法set、get、has、delete、clear;遍历方法:Keys、values、entries、forEach
可以跟各种数据类型格式转换 - WeakMap
只接受对象作为键名(null)除外,不接受其他类型的值作为键名
键名是弱引用,键值可以是任意的,键名所指向的对象可以被垃圾回收机制回收,此时键名是无效的
不能遍历
方法有:get、set、has、delete
推荐阅读
-
Python中内置数据类型list,tuple,dict,set的区别和用法
-
一文搞懂ES6中的Map和Set
-
set_include_path在win和linux下的区别
-
对python内置map和six.moves.map的区别详解
-
Python中内置数据类型list,tuple,dict,set的区别和用法
-
彻底弄懂ES6中的Map和Set
-
引用、浅拷贝及深拷贝 到 Map、Set(含对象assign、freeze方法、WeakMap、WeakSet及数组map、reduce等等方法)
-
JS forEach和map方法的用法与区别分析
-
原生JS forEach()和map()遍历的区别、兼容写法及jQuery $.each、$.map遍历操作
-
一文搞懂ES6中的Map和Set