1. Set()
说明 :ES6提供了新的数据结构,它类似于数组,但是成员的都是唯一的,没有重复的值。Set本身是一个构造函数,用来生成Set数据结构。
1.1add()方法
说明:通过add向Set结构加入成员,结果表示Set结构不会添加重复的值
const s = new Set()
;[1, 5, 3, 2, 9, 5, 1].forEach(item => {
s.add(item)
});
console.log(s); //Set(5) {1, 5, 3, 2, 9}
1.2 可初始化参数
说明:Set函数可以接受一个数组(或者具有iterable接口的其他数据结构)作为参数,用来初始化
const s1 = new Set([1, 2, 3])
console.log(s1); //Set(3) {1, 2, 3}
console.log(...s1); //1 2 3
1.3 size
说明: size属性可以查看数组的长度
console.log(s1.size); //3
1.4数组去重
说明:扩展运算符和Set()结合使用
const s3 = [...new Set([1, 2, 2, 2, 1])]
console.log(s3);// [1, 2]
1.5字符串去重
const s4 = [...new Set("aaabc")].join("")
console.log(s4); //abc
1.6 Set实例的属性和方法
1.6.1Set实例属性
- Set.prototype.constructor:构造函数,默认就是Set函数
- Set.prototype.size:返回Set实例的成员总数
1.6.2Set实例方法
add()
说明:向Set实例添加内容
let s5 = new Set([1, 2, 3])
s5.add(5)
console.log(s5); //Set(4) {1, 2, 3, 5}
delete()
说明:删除指定内容
console.log(s5.delete(2)); // true删除某个值成功,括号内的非索引
has()
说明:判断某个值是否再Set实例中
console.log(s5.has(1)); //true
clear()
说明:清除Set实例所有的内容
s5.clear()
console.log(s5); //Set(0) {size: 0}
1.7Array.from()
说明:将Set结构转成数组
const s6 = new Set([1, 5, 2, 1])
const s7 = Array.from(s6)
console.log(s7); //[1, 5, 2]
1.8数组去重函数
function disRepaet(arr) {
return Array.from(new Set(arr))
}
console.log(disRepaet([1, 1, 1, 1, 1])); //[1]
1.9遍历操作
1.9.1keys(),values(),entries()
说明:keys方法、values方法、entries方法返回的都是遍历器对象,可以用扩展运算符提取出来,由于 Set 结构没有键名,只有键值(或者说键名和键值是同一个值)
const s8 = new Set([5, 2, 3])
console.log(...s8.keys());
console.log(...s8.values());
console.log(...s8.entries());
1.9.2 for of
const s9 = new Set([1, 2, 5, 8])
for (let i of s9) {
console.log(i);
/*
1
2
5
8
*/
}
1.9.3 forEach
const s10 = new Set([5, 4, 6, 8])
s10.forEach((value, index) => {
return console.log(`value是${value},index是${index}`);
})
/*
value是5,index是5
value是4,index是4
value是6,index是6
value是8,index是8
*/
注意:Set 结构的键名就是键值(两者是同一个值),因此第一个参数与第二个参数的值永远都是一样的。
1.10map,filter函数使用
说明:Set 结构的键名就是键值(两者是同一个值),因此第一个参数与第二个参数的值永远都是一样的。
const s11 = new Set([5, 4, 6, 8, 9])
const s12 = [...s11].map(item => item * 2)
console.log(s12);//[10, 8, 12, 16, 18]
const s13 = [...s11].filter(item => item > 8)
console.log(s13); //[9]
1.11遍历操作中改变原来的 Set 结构
- 利用Set结构映射出一个新的结构,然后赋值给原来的Set结构
- 利用Array.from方法
2.WeakSet
说明:WeakSet结构与Set类似,也是不重复的值的集合。区别是WeakSet的成员只能是对象
const w1 = new WeakSet()
w1.add(1) //Invalid value used in weak set
注意:weakSet是弱引用,如果其他对象不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的空间, WeakSet是一个构造函数,可以接受一个数组或类似数组的对象作为参数。任何具有Iterable接口的对象,都可以作为WeakSet的参数。
例1
const w2 = new WeakSet([[123], [12]])
console.log(w2); //WeakSet {Array(1), Array(1)}
例2
const w3=new WeakSet([1,2,3]) //invalid value used in weak set
const w4 = new WeakSet([[123]]) //正确的写法
2.1参数中数组的成员只能是对象
const w4 = new WeakSet([[123]])
console.log(w4); //{Array(1)}
2.1WeakSet()三种方法
add(),delete(),has()和Set()函数一样的用法
3.Map函数
说明:JavaScript的对象,本质上是键值对的集合,但是键的范围不限于字符串,各种类型的值都可以当作键。
const m = new Map()
const b = [123]
m.set(b, "arry")
3.1实例的方法和属性
3.1.1get()
console.log(m.get(b));//arry
3.1.2size
console.log(m.size); //1
3.1.3has()
console.log(m.has(b)); //true
3.1.4delete()
console.log(m.delete(b)); //删除成功返回值是true
3.1.5clear()
console.log(m.clear()); //清除所有成员,没有返回值
console.log(m); //Map(0) {size: 0}
3.2 Map接受一个数组作为参数
说明: Map可以接受一个数组作为参数,数组里面也要是数组,也就是双元素的数组的数据结构。
const m1 = new Map([[1, "张三"]])
console.log(m1); //Map(1) {1 => '张三'}
3.3键值覆盖
说明:同一个键多次赋值,后面的值会覆盖前面的值
const m2 = new Map([["name", "张三"]])
m2.set("name", "李四")
console.log(m2); //Map(1) {'name' => '李四'}
3.4get()
说明:get方法无法读取数组键名,返回undefined。
const m3 = new Map()
m3.set(["name"], "张三") //数组作为Map的键时,需要将数组转换为字符串才能进行比较
console.log(m3.get(["name"]));
总结:Map的键实际上跟内存地址绑定的,只要内存地址不一样,就视为两个键
3.5 遍历方法
3.5.1key(),values(),entries()
const m4 = new Map([["name", "张三"], ["age", 18]])
// keys()
console.log(...m4.keys());//name age
// values()
console.log(...m4.values()); //张三 18
//entries()
console.log(...m4.entries()); //['name', '张三'] (2) ['age', 18]
3.5.2forEach
m4.forEach(item => console.log(item))
//张三
//18
3.5.3filter,map
说明:Map结构可以转为数组结构,拥有数组的方法,如果filter,map方法。
3.5.4其他数据结构的互相转换
- Map转为数组
const m5 = new Map([["name", "张三"], ["age", 18]])
console.log([...m5]); //[Array(2), Array(2)]
- 数组转为Map
说明:讲数组传入Map构造函数,就可以转为Map
- Map转成对象
function changeObject(mapObject) {
let newObject = Object.create(null)
for (let [key, value] of mapObject) {
newObject[key] = value
}
return newObject
}
console.log(changeObject([["name", "张三"]])); //{name: '张三'}
-
对象转成Map
let obj1 = { "name": "李四", "age": "18" }
let newMap = new Map(Object.entries(obj1))
console.log(newMap);//Map(2) {'name' => '李四', 'age' => '18'}
- Map转成JSON
Map转为JSON要区分两种情况,一种是Map的键名都是字符串,这是可以转为对象,再转成JSON类型,如果键名是非字符串,这时可以选择转为数组JSON
- JSON转成Map
正常情况下,所有键名都是字符串,有一种特殊情况,整个 JSON 就是一个数组,且每个数组成员本身,又是一个有两个成员的数组。这时,它可以一一对应地转为 Map。
4.WeakMap
说明:WeakMap只接受对象作为键名(null除外),不接受其他类型的值作为键名。WeakMap的键名所指向的对象,不计入垃圾回收机制。
4.1 WeakMap的语法
const w5=new WeakMap([[[123],"张三"]])
console.log(w5);//{Array(1) => '张三'}
4.2get()
// get()
console.log(w5.get([123])); //undefined 内存地址不一样,就视为两个键
4.3 set()
console.log(w5.set([214],"王二")); //WeakMap {Array(1) => '王二', Array(1) => '张三'}
4.4 has()
console.log(w5.has([214])); //false 内存地址不一样,就视为两个键
4.5delete()
console.log(w5.delete([214])); //false 内存地址不一样,就视为两个键