Set
基本用法
ES6提供了新的数据结构-Set。类似与数组,但是成员的值都是唯一的。没有重复的。
const s = new Set();
s.add(1);
s.add(1);
console.log(s,size)//2
// 上面代码通过add方法 向Set结构加入成员 结果表示Set结构不会添加重复的值
向Set加入值时不会发生类型转换,所以 5 和 '5'是两个不同的值。Set内部判断两个值是否相同时使用的算法叫做"Same-value equality" 它类似与 精确相等运算符 '===' 主要的区别是能够识别 NaN 等于自身。 而精确运算符不认为NaN等于自身
Set实例的属性和方法
- add() 添加某个值,返回Set结构本身。
- delete() 删除某个值,返回一个布尔值。表示是否删除成功
- has() 返回一个布尔值,表示参数是否为Set的成员。
- clear() 清除所有成员 没有返回值
- size 返回Set一共有几个成员
let set = new Set();
set.add(1);
set.add(3);
add.has(1); // true
add.delete(3);
add.has(3);//false
add.size; //1
add.clear();
add.has(1);//false
// Arrary.from() 能够是 Set数据变成数组
let items= new Set([1,2,3,2,3]);
console.log(Array.from(items));//[1,2,3] 可以数组去重
console.log([...items]);// 也可以实现数组去重
遍历操作
Set结构有四种遍历的方法
- keys() 返回键名的遍历器
- values() 返回键值的遍历器
- entries() 返回键值对的遍历器
- forEach() 返回回调函数每个成员
let set = new Set([1, 2, 3, 4]);
// keys()
for(var item of set.keys()){
console.log(item);
/*
1
2
3
4
*/
}
// values() 因为 Set结构中 键值与键名是一样的 所以 keys() 与 values() 遍历结果是一样的
for(var item of set.values()){
console.log(item);
}
// entries()
for(var item of set.entries()){
console.log(item);
}
数组的map与 filter也能用于Set 只不过返回的结果是Set结构 Array.from() 可以使Set结构变成数组
Map
含义与基本含义
js的对象本质上是键值对的集合,但是只能用字符串作为键,这给它带来很大的限制。于是提供了Map数据结构
基本用法
- set(key,value)设置key所对应的键值 然后返回整个Map结构
- get(key)读取key对应的键值 如果不存在就返回 undefined
- has(key) 返回一个布尔值,表示某个键是否在Map数据结构中
- delete(key) 方法删除某个键 成功 返回true 反之 false
- clear() 清除所有成员 没有返回值
- size 返回Map的成员个数
遍历方法
- keys() 返回键名的遍历器
- values() 返回键值的遍历器
- entries() 返回键值对的遍历器
- forEach() 返回回调函数每个成员
let map = new Map([
['user', 'wuhao'],
['age', 18]
]);
//keys()
for (let item of map.keys()){
console.log(item);
}
//values()
for (let item of map.values()){
console.log(item);
}
//values()
for (let item of map.entries()){
console.log(item);
}
与其他数据结构的互相转换
let ma = new Map([['names','air'],['add','hz']]);
// 转换为 数组
console.log(Array.from(ma));
console.log([...ma]);
// 转化为对象
let obj = {};
for(let va of ma.keys()){
obj[va] = ma.get(va)
}
console.log(obj);
// 对象转换为 Map
let map1 = new Map();
for(let va of Object.keys(obj)){
map1.set(va,obj[va])
}
console.log('map',map1);
注意
只有对同一个对象引用,Map结构才将其视为同一个键。
let ma = new Map([['names','air'],['add','hz']]);
ma.set(['a'],11);
console.log(ma.get(['a']));// undefined
// 上面的set和get表面上是针对同一个键 实际却是两个值。内存地址是不一样的,因此get方法无法读取改建 返回undefined
// Map的键实际是跟内存地址绑定的,只要内存不一样 就是为两个键。
// 只要Map的键是一个简单类型的值 则只要两个值严格相等就将是为一个键 0 -0和 NaN都视为一个键