《深入理解ES6》阅读随笔
在原来 ES5 中没有 Set 和 Map 时,可以通过数组来模拟实现,但是会存在一些问题:
- 数组对象的值或者键只能用字符串来表示,如果使用数字或者对象等其他类型来定义时,会进行强制类型转换;
- 在判断值或者键是否存在时,存在歧义,比如值为 0 时,那么其布尔值就为 false,但其实该值是存在的。
为了解决数组创建集合所带来的各种问题,在 ES6 中正式新增了 Set 集合和 Map 集合的概念。
Set 集合
基本属性:Set 集合是一个有序无重复的集合,有以下基本功能:
// 声明
let animals = new Set(['cat'])
// 判断是否存在
console.log(animals.has('cat')) // true
// 数量
console.log(animals.size) // 1
// 新增
animals.add('dog')
console.log(animals) // Set { 'cat', 'dog' }
// 删除
animals.delete('cat')
console.log(animals) // Set { 'dog' }
// 清空
animals.clear()
console.log(animals) // Set {}
在创建 Set 集合时,可以自动去重:
// 声明
let animals = new Set([1, 2, 3, 3, 3]);
console.log(animals.size); // 3
console.log(animals); // Set {1,2,3}
forEach:Set 在使用 forEach 时与数组类似,但是第一参数与第二参数为了与其他 forEach 保持统一,均为 value :
// 声明
let animals = new Set(['cat']);
animals.forEach((value, key, arr) => {
console.log(value, key); // cat cat
console.log(arr); // Set { 'cat' }
});
Weak Set:
在使用对象作为 Set 的值时,当作为值的对象被销毁时,并不会自动销毁 Set 中的对象值,这回导致额外的内存驻留,甚至溢出。此时可以使用 Weak Set 来声明,当作为值的对象被销毁时,在 Weak Set 中的对象也会被自动回收。
Map 集合
基本用法:与 Set 类似,除了键还有了值的概念;
// 声明
let animals = new Map([['cat','Tom']])
// 判断是否存在
console.log(animals.has('cat')) // true
// 数量
console.log(animals.size) // 1
// 新增
animals.set('dog','Wangcai')
console.log(animals) // Map { 'cat', 'dog' }
// 删除
animals.delete('cat')
console.log(animals) // Map { 'dog' }
// 清空
animals.clear()
console.log(animals) // Map {}
Map 中也有 forEach 和 Weak Map 的概念,与 Set 类似,这里就不赘述了。
网友评论