ES6新增数据类型之Set、WeakSet

吐槽君 分类:javascript

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,失败返回false set.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,失败返回false map.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这个清空的功能

回复

我来回复
  • 暂无回复内容