ES6新增数据类型之Set、WeakSet

343 阅读3分钟

1、Set()

img

Set() 是ES6新增的一种集合类型,结构和Array 很像,只是它的方法和属性没有Array丰富,但是有一点,它的成员是唯一的,没有重复的值

它的API和Map很类似,只是用add() 替换了Mapset(),并且没有了 get() 方法

1.1 基本的API

1、创建一个Set

Set 本身是一个构造函数,用来生成 Set 数据结构

let set = new Set();
console.log(set);  // {}

Set() 对象可以存储任意类型的值,但是Set() 构造函数传入的参数只能是可迭代对象,如:数组、字符串

// 当你传入一个整数时,js会告诉你传入的参数1不是可迭代对象
let set = new Set(1);
console.log(set); // number 1 is not iterable

// 必须是数组或字符串,传入对象会报错
let set1 = new Set('1');
console.log(set1);
let set2 = new Set([1, 'true']);
console.log(set2);

2、常见的方法

方法说明示例
has()判断是否有该值,返回布尔值set.has('name')
add()向Set()添加元素,若有相同会覆盖set.add('name', 'zxc')
delete()用于删除某个元素,成功则返回true,失败返回falseset.deldect('name')
clear()用于清空 Set() 中所有的成员,没有返回值set.clear()
size 属性判断 Set() 有多少个元素set.size
let set = new Set()
let arr = [1, 2]
set.add(1).add(arr)
set.add(function() { console.log(123); })
set.add({})
console.log(set); // { 1, [ 1, 2 ], [Function (anonymous)], {} }

// has() 判断元素
console.log(set.has(arr));  // true

// size 判断长度
console.log(set.size);  // 4

// delete 删除
console.log(set.delete(1)); // true

// clear 清除
set.clear()
console.log(set);  // {}

1.2 顺序与迭代

Set() 结构有四个遍历的方法

方法说明示例
keys()返回键的遍历器set.keys()
values()返回值的遍历器set.values()
entries()返回所有成员的遍历器,包含键,值set.entries()
forEach遍历Set的所有成员set.forEach(function(), [this])

由于Set结构没有键名,所以其键名和键值是一致的

let set = new Set(['张三', '李四', '王五', 'true']);
// 遍历键 
console.log(set.keys());  // { '张三', '李四', '王五', 'true' }
// 遍历值
console.log(set.values());  // { '张三', '李四', '王五', 'true' }
// 返回键值
console.log(set.entries());
/* {
  [ '张三', '张三' ],
  [ '李四', '李四' ],
  [ '王五', '王五' ],
  [ 'true', 'true' ]
}*/

// forEach() 循环
let set = new Set(['张三', '李四', '王五', 'true'])
set.forEach(function(value, key) {
    console.log(key + ':' + value);
})
/*
张三:张三
李四:李四
王五:王五
true:tru*/

也可以使用 for...offor...in

// 遍历值
for (let value of set) { console.log(value);}
// 遍历键
for (let key in set) {console.log(key);}

1.3 Set() 类型转换

Set 类型可以与其它类型的值进行转换

  1. Array 转换为 Set
let arr = [1, 2, 3, 4]
let set = new Set(arr)
console.log(set);  // { 1, 2, 3, 4 }
  1. Set 转换为 Array可以通过扩展运算符 ... 来实现
let set = new Set([1, 2, 3, 4])
console.log([...set]);  // [ 1, 2, 3, 4 ]
  1. String 转换为 Set
let str = '张三'
let set = new Set(str)
console.log(set); // { '张', '三' }

1.4 Set 对象的作用

利用Set不重复性可以用于数组的去重

// 将数组转换为Set,再将Set转换为数组
let arr = [1, 1, 4, 1, 2, 3, 1, 2]
let set = new Set(arr)
console.log([...set]); // [ 1, 4, 2, 3 ]

并集操作:将两个数组进行并集操作

let arr1 = [1, 1, 4, '1', 2, 3]
let arr2 = [5, 1, '2']
let set = new Set([...arr1, ...arr2])
console.log([...set]); // [ 1, 4, '1', 2, 3, 5, '2' ]

Set 不允许强制转换,1 和 ‘1’ 被认为是不同的值

总结:

  1. Set() 最大的特点就是它的元素是唯一的,基于这个特性可以用于去重
  2. Set() 可以存储任意类型的值,但是初始化的时候只能传入可迭代对象
  3. Set() 可以与Array 进行互相转换,也可以把 String 转换为 Set类型

2、WeakSet()

img

WeakSet 是一种 “若集合”类型,其集合中的值只能是对象

2.1 API

方法说明示例
has()判断是否有该值,返回布尔值map.get('name')
add()向Set()添加元素,若有相同会覆盖map.set('name', 'zxc')
delete()用于删除某个元素,成功则返回true,失败返回falsemap.deldect('name')

1、创建一个空的WeakMap

let WeakSet = new WeakSet();

2、初始化WeakSet

构造函数可以传入一个迭代对象,可迭代对象中的值必须得是对象

let x = { id: 1 },
    y = { id: 2 }
let weakSet = new WeakSet([x, y]);
console.log(weakSet);

console.log(weakSet.has(x)); // true
console.log(weakSet.delete(x)); // true

WeakSet 中没有clear方法 和 size属性

因为 WeakSet 中的值任何时候都可能被销毁,所以没必要提供迭代的功能,也用不着先clear这个清空的功能