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实例属性

  1. Set.prototype.constructor:构造函数,默认就是Set函数
  2.  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 结构

  1. 利用Set结构映射出一个新的结构,然后赋值给原来的Set结构
  2. 利用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   内存地址不一样,就视为两个键
05-16 03:34