ES6学习笔记(一)--Set和Map

关于Set

Set是什么?

  Set是es6新的数据结构,类似数组,是一个构造函数。

Set可以用来做什么?

  1.用来数组快速去重

const a_list = [1,2,1,2,2,3,4,5]
// 可接收数组参数
const a_set = new Set()
console.log(...a_set) // 1 2 3 4 5
const b_list = Array.from(a_set)
console.log(b_list) // 1 2 3 4 5
// 可接收字符串参数 const b_str = 'abcdefgabcdefg' console.log(...new Set(b_str)) // a b c d e f g tips:向Set加入数值不发生类型转换 5跟 '5'一起加入是不会被去重的 NaN === NaN // false 但是Set认为是相等的

2.实例的属性方法

  

// 增 ---添加值,并返回整个Set实例
  a_set.add(2) 

// 删  --- 删除Set实例成员值,并返回布尔值
   a_set.delete(2) // true

// 查 ---  查找是Set实例否存在这个值,并返回布尔值
   a_set.has(2) // false

// 清除全部 ---清除Set实例全部内容,不返回任何值
   a_set.clear()

// 长度 --- 返回Set实例成员的总数
   a_set.size() 

// 遍历 --- 遍历键keys、值values、键值对;由于Set数据结构没有键名,只有键值,所以keys/values 遍历的结果都一样
for(let item of a_set.keys()){
console.log(item) // 1 2 3 4 5 6
}
   for(let item of a_set.values()){
console.log(item) // 1 2 3 4 5 6
}
   for(let item of a_set.entries()){
console.log(item) // [1,1] [2,2] [3,3 [4,4] [5,5] [6,6]
}

tips:Set数据结构的实例默认就是values遍历 所以直接 for(let item of a_set){} 就可以
也可以a_set.forEach(function(value, key, aSet){ console.log(key,value) })
数组的map、filter方法也同样适用a_set

3.Set数据结构跟Array数组互转

// Set转数组
const c_list = Array.from(a_set);

//数组转Set
const d_set = new Set(c_list)

关于WeakSet

    跟Set类似,也是一个不重复值的集合,但与Set有三点不同

   1)只能存储对象

   2) 其成员的对象都是弱引用,即垃圾回收机制不考虑WeakSet对该对象的引用,

    一旦其他对象不引用该对象,那么垃圾回收机制就会自动回收该对象所占用的内存,不管该对象是否存在于WeakSet中

   3)只有add() / delete() / has() 方法,不能遍历

关于Map

   es6之前,作为键值对集合的Object的键只能是字符串,即使是不是字符串也将被自动转为字符串

   es6的Map的出现解除了这种限制,作为键,可以是任意值

 const key = {a: 'a'}
 const value = [1,2,3,4]
 const a_map = new Map([)
 a_map.set(key, value)
 a_map.get(key) // [1,2,3,4]

 // 与Set一样有has()、delete()、clear()方法,size属性,且有set()、get()方法
 a_map.has(key) // true
 a_map.deltete(key) // true
 a_map.has(key) // false 

// 可接受数组作为参数,且成员一定要是表示键值的双元素小数组
const  b_list = [[1, 2], ['key', 'value']]
const  b_map = new Map(b_list)
b_map.get(1) // 2
b_map.get('key') // 'value'

const d_set  = new Set([1,2],['key', 'value'])
const c_map = new Map(d_set)
c_map.get('key') // 'value'
const d_map = new Map(c_map)
d_map.get('key') // 'value'

// 如果对同一个键赋值多次,会产生覆盖效果
d_map.set('key', 'value1')
d_map.get('key') //  'value1'
tips:当用对象作为键,要注意是否是同一个对象
       d_map.set({a:'b'},'obj')
       d_map.get({a:'b'}) // undefined
NaN === NaN false NaN不严格相等于自身 但是Map视为同一个键
// 跟Set一样可以进行遍历
   1) d_map.values() //  返回值 
   2) d_map.keys()   // 返回键
   3) d_map.entries() // 返回键值
   4) d_map.forEach() // 遍历所有成员
// Map集合转为数组
const d1_list = [...d_map.values()] // 所有值组成的数组
const d2_list = [...d_map.keys()]   // 所有键组成的数组
const d3_list = [...d_map.entries()] // 所有键值小数组组成的大数组
const d4_list = [...d_map]   // 所有键值小数组组成的大数组

关于WeakMap

   跟Map一样有set、get方法,跟WeakSet一样只接受对象作为键(null除外),

  也是弱引用,会被垃圾回收机制自动回收,也是不能遍历,没有size属性,

  注意这里的对象引用只是键的引用不是键值,

原文地址:https://www.cnblogs.com/zhangky/p/12209811.html