一、Set
ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。
Set
本身是一个构造函数,用来生成 Set 数据结构。
Set
函数可以接受一个数组(或者具有 iterable 接口的其他数据结构)作为参数,用来初始化。
// 创建一个set集合,传参必须为一个可迭代对象
const s1 = new Set([1,2,3,3,5,1])
console.log(s1)//Set(4) {1, 2, 3, 5}
方法
①add(value)添加数据,并返回新的 Set 结构
const s1 = new Set()
s1.add(1)
s1.add(1)//无效添加
s1.add(+0)
s1.add(-0)
s1.add(NaN)
s1.add(NaN)
let obj = {}
s1.add(obj)
s1.add(obj)
// Set 内部判断两个值是否不同,使用的方法为 Object.is() 除了0的比较
console.log(s1)//Set(4) {1, 0, NaN, {…}}
②delete(value)删除数据,返回一个布尔值,表示是否删除成功
const s1 = new Set()
s1.add(1)
s1.add(1)//无效添加
s1.add(+0)
s1.add(-0)
s1.add(NaN)
s1.add(NaN)
console.log(s1.delete(1)); //true
console.log(s1)// Set(2) {0, NaN}
③has(value)查看是否存在某个数据,返回一个布尔值
const s1 = new Set()
s1.add(1)//无效添加
s1.add(+0)
s1.add(NaN)
console.log(s1.has(1)); //true
④clear()清除所有数据,没有返回值
const s1 = new Set()
s1.add(1)
s1.add(+0)
s1.add(NaN)
s1.clear()
console.log(s1); // Set(0) {}
遍历方法
var uname = new Set(['LCY','ZGX','XZY','WJQ'])
for (const iterator of uname) {
// console.log(iterator);
}
//LCY
//ZGX
//XZY
//WJQ
uname.forEach(element => {
console.log(element);
});
//LCY
//ZGX
//XZY
//WJQ
console.log( uname.keys());// SetIterator {"LCY", "ZGX", "XZY", "WJQ"}
二、Map
JavaScript 的对象(Object),本质上是键值对的集合(Hash 结构),但是传统上只能用字符串当作键。这给它的使用带来了很大的限制。为了解决这个问题,ES6 提供了 Map 数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。也就是说,Object 结构提供了“字符串—值”的对应,Map 结构提供了“值—值”的对应,是一种更完善的 Hash 结构实现。如果你需要“键值对”的数据结构,Map 比 Object 更合适。
const map = new Map([
['a','b'],
[{},777],
[123,555],
[undefined,6666]
])
console.log(map)//Map(4) {"a" => "b", {…} => 777, 123 => 555, undefined => 6666}
// 参数传递一般都是二维数组的形式,子数组只能有两项,第一项为键名,第二项为键值
方法
const map = new Map([
['a','b'],
[123,555],
])
let obj = {};
//set添加值
map.set(obj,888)
map.set(obj,969)//值覆盖
console.log(map);//Map(3) {"a" => "b", 123 => 555, {…} => 969}
//get()获取值
console.log( map.get('a'));//'b'
console.log(map.size);//3
//has()是否存在
console.log(map.has(123)); //true
console.log(map.delete(123)); // 删除一个布尔值
console.log(map);//Map(2) {"a" => "b", {…} => 969}
console.log(map.clear()); // 清空所有成员 无返回
console.log(map);//Map(0) {}
三、 Map数据结构和传统object区别(面试点)
①同名碰撞
我们知道,对象其实就是在堆开辟了一块内存,其实Map的键存的就是这块内存的地址。只要地址不一样,就是两个不同的键,这就解决了同名属性的碰撞问题,而传统的Object显然做不到这一点
②可迭代
Map实现了迭代器,可用for...of遍历,而Object不行。
③长度
Map可以直接拿到长度,而Object不行。
④有序性
填入Map的元素,会保持原有的顺序,而Object无法做到。
⑤可展开
Map可以用省略号语法展开,而Object不行。