Skip to main content

map-weakMap-set-weakSet

Map
  1. 键值对表示 键值可是基础数据类型也可以是引入数据类型
// ** 创建
const mapInstance = new Map();
const a = { b: 2 };
// ** 插入值
mapInstance.set(a, a);
// ** 访问值
const a1 = mapInstance.get(a);
console.log(a1 === a); // true
// ** 构造函数创建1
const otherMap1 = new Map([["key1", "value1"]]);
/*
Map(3) {
'key1' => 'value1'
}
*/
// ** 构造函数创建2
const doubleArr = [
[1, "a"],
[2, "b"],
];
const otherMap2 = new Map(doubleArr);
// ** size 长度
console.log(otherMap2.size); // 2
// ** keys()
console.log(otherMap2.keys()); // [Map Iterator] { 1, 2 }
for (let key of otherMap2.keys()) {
console.log(key); // 1 2
}
// ** values()
console.log(otherMap2.values()); // [Map Iterator] { 'a', 'b' }
for (let key of otherMap2.values()) {
console.log(key); // a b
}
// ** entities()
console.log(otherMap2.entries()); // [Map Entries] { [ 1, 'a' ], [ 2, 'b' ] }
for (let value of otherMap2.entries()) {
console.log(value); // [ 1, 'a' ] [ 2, 'b' ]
}
// ** 遍历 for ... of
for (let [key, value] of otherMap2) {
console.log(key, value); // 1 a // 2 b
}
// ** forEach
otherMap2.forEach((item, key) => {
console.log(item, key); // a 1 // b 2
});
// ** 其他用法
console.log([...otherMap2]); // [ [ 1, 'a' ], [ 2, 'b' ] ]
console.log(Array.from(otherMap2)); // [ [ 1, 'a' ], [ 2, 'b' ] ]
console.log(new Map(otherMap2)); // Map(2) { 1 => 'a', 2 => 'b' }
console.log(new Map([...otherMap2])); // Map(2) { 1 => 'a', 2 => 'b' }
console.log(new Map(otherMap2) === otherMap2); // false
WeakMap
  1. 键值对的集合,其中健只能是对象,值可以是任意的
  2. 对 key 为弱引用 没有其他引用 GC 回收
  3. javascript 强引用跟弱引用原理??
const weakMap = new WeakMap();
const obj = { a: 1 };
weakMap.set(obj, "111");
// console.log(weakMap) //WeakMap { <items unknown> }
const getResult = weakMap.get(obj);
// console.log(getResult) // 111
const hasKey = weakMap.has(obj);
console.log(hasKey); // true
weakMap.delete(obj);
const hasResult = weakMap.has(obj);
// console.log(hasResult) // false
Set
  1. Set 对象允许你存储任何类型的唯一(*唯一的判断是===吗)值,是值得集合
const setInstance = new Set();
setInstance.add(1);
setInstance.add("a");
setInstance.add(null);
setInstance.add(NaN);
setInstance.add({ a: 1, b: 2 });
setInstance.add(function add() {
return "aaa";
});
console.log(setInstance);
// Set(6) { 1, 'a', null, NaN, { a: 1, b: 2 }, [Function: add] }
setInstance.has(NaN); // true
setInstance.has(null); // false
setInstance.has(function add() {
return "aaa";
}); // false
setInstance.size; // 6

// 迭代
for (let item of setInstance) {
console.log(item); // 1 a null NaN ...
}
setInstance.forEach((item) => {
console.log(item); //1 a null NaN ...
});

setInstance.keys();
// [Set Iterator] { 1, 'a', null, NaN, { a: 1, b: 2 }, [Function: add] }
setInstance.values();
// [Set Iterator] { 1, 'a', null, NaN, { a: 1, b: 2 }, [Function: add] }
setInstance.entries();
// [Set Entries] {
// [ 1, 1 ],
// [ 'a', 'a' ],
// [ null, null ],
// [ NaN, NaN ],
// [ { a: 1, b: 2 }, { a: 1, b: 2 } ],
// [ [Function: add], [Function: add] ]
// }

// 其他操纵
new Set([0, 1, 2]); // Set(3) { 0, 1, 2 }
const arr = [...new Set([1, 2, 3])]; // [1, 2, 3]
new Set("Hello"); // { 'H', 'e', 'l', 'o'}
WeakSet
  1. 集合中元素只能是对象
  2. 集合中的对象的引用为弱引用,如没有其他对元素的引用,元素会被 GC
const weakSet = new WeakSet();
const obj1 = { a: 1, b: 2 };
const obj2 = function () {
return "sss";
};
weakSet.add(obj1);
weakSet.add(obj2);
// WeakSet { <items unknown> }
weakSet.has(obj1); // true
weakSet.delete(obj1);
weakSet.has(obj1); // false