gdjlc

培养良好的习惯,每天一点一滴的进步,终将会有收获。

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

Set 是不包含重复值的列表。
Map 是键值对的有序列表,键和值都可以是任意类型。

一、Set

1、Set的创建、增加、删除、和数组互转等

1、Set的创建、增加、删除、和数组互转等
//创建Set和添加项目
let set = new Set(); 
set.add(5);
set.add(5); //多次添加相同值,只保留第一个
set.add("5");
console.log(set.size); // 2

//使用数组来初始化一个 Set
let set2 = new Set([1, 2, 3, 4, 5, 5, 5, 5]);
console.log(set2.size); // 5

//Set转数组
let array = [...set2];
console.log(array); // [1,2,3,4,5]

//判断Set中是否存在某个值
console.log(set2.has(5)); //true
console.log(set2.has(6)); //false

//移除单个值
set2.delete(5);
console.log(set2.has(5)); //false
console.log(set2.size); //4

//移除所有值
set2.clear();
console.log(set2.size); //0

2、Set 上的 forEach() 方法

forEach() 方法会被传递一个回调函数,该回调接受三个参数:Set中下个位置的值、与第一个参数相同的值、目标Set 自身。
具有 forEach() 方法的其他对象(即数组与 Map )都会给回调函数传递三个参数,前两个参数都分别是下个位置的值与键(给数组使用的键是数值索引)。
Set却没有键,为了让这些回调函数保持参数相同,将Set中的每一项同时认定为键与值,所以该回调函数的前两个参数就始终相同。

let set = new Set([1, 2]);
set.forEach(function(value, key, ownerSet) {
    console.log(key + " " + value);
    console.log(ownerSet === set);
});
/*输出:
1 1
true
2 2
true
*/

3、Weak Set

对象存储在 Set 的一个实例中时,实际上相当于把对象存储在变量中。只要对于 Set 实例的引用仍然存在,所存储的对象就无法被垃圾回收机制回收,可以被称为 Strong Set。

let set = new Set(),
key = {a: 1};
set.add(key);
console.log(set.size); // 1
// 取消原始引用
key = null;
console.log(set.size); // 1
// 重新获得原始引用
key = [...set][0];
console.log(key); //{a: 1}

将key设置为 null 清除了对key对象的一个引用,但是另一个引用还存于set内部。你仍然可以使用扩展运算符将Set 转换为数组,然后访问数组的第一项,key变量就取回了原先的对象。

Weak Set只允许存储对象弱引用,不能存储基本类型的值。对象的弱引用在它自己成为该对象的唯一引用时,不会阻止垃圾回收。
Weak Set 没有 forEach() 方法和size 属性。

let set = new WeakSet(),
key = {};
// 将对象加入 set
set.add(key);
console.log(set.has(key)); // true
//set.delete(key);
//移除对于键的最后一个强引用,同时从Weak Set中移除
key = null;

二、 Map

1、Map的创建、增加、删除等

1、Map的创建、增加、删除等
let map = new Map();
//添加键值对
map.set("name", "张三"); 
map.set("age", 20);

//查询有多少个键值对
console.log(map.size); // 2

//判断指定的键是否存在于 Map 中
console.log(map.has("name")); // true

//根据指定的键获取对应的值
console.log(map.get("name")); // "张三"

//移除Map中的键以及对应的值
map.delete("name");

//移除Map中所有的键与值
map.clear();

console.log(map.has("name")); // false
console.log(map.get("name")); // undefined

//使用数组初始化
let map2 = new Map([["name", "张三"], ["age", 20]]); 
//map2键值对和map一样
console.log(map2.get("name")); // "张三"
console.log(map2.get("age")); // 20
console.log(map2.size); // 2

2、Map 上的 forEach 方法

let map = new Map([["name", "张三"], ["age", 20]]); 
map.forEach(function(value, key, ownerMap) {
    console.log(key + " " + value);
    console.log(ownerMap === map);
});
/*输出:
name 张三
true
age 20
true
*/

3、Weak Map

在Weak Map中,所有的键都必须是对象,当这些键在Weak Map之外不存在引用时,该键值对会被移除。

let key1 = {},
    key2 = {},
    map = new WeakMap([[key1, "Hello"], [key2, 42]]);
console.log(map.has(key1)); // true
console.log(map.get(key1)); // "Hello"
console.log(map.has(key2)); // true
console.log(map.get(key2)); // 42

 

posted on 2021-03-15 17:56  gdjlc  阅读(72)  评论(0编辑  收藏  举报