深入理解ES6读书笔记6:Set和Map

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

一、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的创建、增加、删除等

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值