六、Set和Weakset ------ 2019-09-02

1、Set的定义:Set是ES6中新提供的一种数据结构,类似数组Array,Set本身也是一个构造函数,用来生成Set数据结构;

2、基本语法、用法:

//(1)初始化一个Set数据
let set = new Set()
console.log(set) // Set(0) {}

//(2)传递一个数组作为参数初始化Set数据
let set = new Set([1, 2, 3, 4, 5]) // Set构造函数接收一个数组作为参数,可以将数组转换成Set数据结构
console.log(set) // Set(5) {1, 2, 3, 4, 5}

//(3)原则上也可以传递一个字符串初始化Set数据
let set = new Set('abcde')
console.log(set) // Set(5) {"a", "b", "c", "d", "e"}

//(4)可以接受类似数组的对象作为参数(可以理解为只要存在length属性就是类似数组);
let dv = document.getElementsByTagName('div')
let set = new Set(dv)
console.log(set) // Set(5) {div, div, div, div, div}

3、使用注意事项:

// (1)Set不会添加重复的值,会自动筛选掉重复的值(这个特性经常被用来数组和字符串去重);
let set = new Set([1, 2, 3, 4, 5, 3, 2, 1, 2])
console.log(set) // Set(5) {1, 2, 3, 4, 5}

// (2)向 Set 加入值的时候,不会发生类型转换
let set = new Set();
set.add(5)
set.add('5')
console.log(set) // Set(2) {5, "5"}

let set = new Set();
let a = NaN;
let b = NaN;
set.add(a);
set.add(b);
set // Set {NaN}

// 原理:Set 内部判断两个值是否不同,使用的算法叫做“Same-value-zero equality”,它类似于精确相等运算符(===),
// 主要的区别是向 Set 加入值时认为NaN等于自身,而精确相等运算符认为NaN不等于自身。

4、Set实例存在的属性和方法:

//(1)set.size属性,获取set数据的长度,和数组的length类似
let set = new Set([1, 2, 3, 4, 5]);
console.log(set) // Set(5) {1, 2, 3, 4, 5}
console.log(set.size) // 5

// (2)set.add()方法:方法会将接收的参数,当做一个元素添加到set数据中;返回 Set 结构本身;
let set = new Set([1, 2, 3]);
set.add(6)
set.add([1,7,8])
console.log(set) // Set(5) {1, 2, 3, 6, Array(3)}

// (3)set.delete()方法:方法接收set数据中的一个值作为参数,将该值从set中删除,并且返回一个布尔值,表示此值是否删除成功
let set = new Set([1, 2, 3, 4, 5]);
let isDelete = set.delete(1);
console.log(isDelete) // true
console.log(set) // Set(4) {2, 3, 4, 5}

// (4)set.has()方法:返回一个布尔值,表示该值是否为Set的成员。
let set = new Set([1, 2, 3, 4, 5]);
let isHas1 = set.has(5);
let isHas2 = set.has(6);
console.log(isHas1, isHas2) // true false

// (5)set.clear()方法:清除所有成员,没有返回值。
let set = new Set([1, 2, 3, 4, 5]);
set.clear()
console.log(set) // Set(0) {}

5、对Set类型数据的遍历

// 注意:由于 Set 结构没有键名,只有键值(或者说键名和键值是同一个值),所以keys方法和values方法的行为完全一致。
let set = new Set(['red', 'green', 'blue']);
console.log(set.keys()) // SetIterator {"red", "green", "blue"}
console.log(set.values()) // SetIterator {"red", "green", "blue"}
console.log(set.entries()) // SetIterator {"red" => "red", "green" => "green", "blue" => "blue"}

    // 直接遍历Set数据
    for (const item of set) {
      console.log(item) 
      // red 
      // green 
      // blue
    }

    // 遍历Set数据的keys接口
    for (const keys of set.keys()) {
      console.log(keys)
       // red 
      // green 
      // blue
    }

    // 遍历Set数据的values接口
    for (const val of set.values()) {
      console.log(val)
      // red 
      // green 
      // blue
    }

    // 遍历Set数据的entries接口
    for (const items of set.entries()) {
      console.log(items)
      //  ["red", "red"]
      //  ["green", "green"]
      //  ["blue", "blue"]
    }

你可能感兴趣的:(六、Set和Weakset ------ 2019-09-02)