SOURCE

// Set WeakSet Map WeakMap
const s = new Set()
const a = [1,2,3,4,5,6,7,8,undefined,undefined]

a.forEach((v, i, arr) => {
    s.add(v)
})
console.log(s.size)

// for (let i of s) {
//     console.log(i)
// }

// 实例对象的方法
// add 添加某个值,返回Set结构本身,可以链式调用
// delete 删除某个值 成功为true 否则为false
// has 返回一个布尔值,是否为Set成员
// clear 清除所有成员,无返回
// size 长度

// 遍历方法
// keys() 返回键名的遍历器
// values() 返回键值的遍历器
// entries() 返回键值对的遍历器
// forEach() 使用灰调函数遍历每个成员
console.log(s.values())
console.log(s.entries())
console.log(Array.from(s.entries()))


// WeakSet
// 成员只能是数据或者类数组的对象,由于不可迭代所以不能用于for of
// WeakSet无size属性

const ws = new WeakSet([[1]])
// ws.add(1) // VM5667:10 Uncaught TypeError: Invalid value used in weak set
console.log(ws)

// Map 和 WeakMap
// Map 是可以-value的键值对,key可为任何类型
// Map和Object的区别,Object有原型

// Map的属性
// clear: ƒ clear()
// constructor: ƒ Map()
// delete: ƒ delete()
// entries: ƒ entries()
// forEach: ƒ forEach()
// get: ƒ ()
// has: ƒ has()
// keys: ƒ keys()
// set: ƒ ()
// size: (...)
// values: ƒ values()
const map = new Map()
map.set('foo', true)
map.set('bar', false)
console.log(map, map.entries())
console.log(map.size)
console.log(map.get('foo'))
console.log(map.has('foo1'))
console.log(map.delete('foo1')) // 删除成功返回true 否则false

// 遍历方法
const map1 = new Map([
    ['a', 1],
    ['b', 2]
])
console.log(map1)
for (let key of map1.keys()) {
    console.log(key)
}
// "a"
// "b"

for (let val of map1.values()) {
    console.log(val)
}
// 1
// 2

for (let item of map1.entries()) {
    console.log(item)
}
// ["a", 1]
// ["b", 2]

for (let [key, value] of map1.entries()) {
    console.log(key +' '+ value)
}
// "a" 1
// "b" 2
// for...of...遍历map等同于使用map.entries()

// 数据类型转化

// Map 转为数组
const arr = [...map]
console.log(arr)
// [["foo", true], ["bar", false]]

// 数组转为Map
console.log(new Map(arr))

// Map转对象
let obj = {}
for (let [key, value] of map) {
    obj[key] = value
}
console.log(obj)
// {foo: true, bar: false}

// 对象转Map
for (let key of Object.keys(obj)) {
    map.set(key, obj[key])
}
console.log(map)

// 可在 vue 中使用 v-for=“[key, value] in map”


// WeakMap
// 只能接收对象的为键名 除 null
// 不能遍历  方法有 get set has delete


// Set

// 是一种叫做集合的数据结构(ES6新增的)
// 成员唯一、无序且不重复
// [value, value],键值与键名是一致的(或者说只有键值,没有键名)
// 允许储存任何类型的唯一值,无论是原始值或者是对象引用
// 可以遍历,方法有:add、delete、has、clear

// WeakSet

// 成员都是对象
// 成员都是弱引用,可以被垃圾回收机制回收,可以用来保存 DOM 节点,不容易造成内存泄漏
// 不能遍历,方法有 add、delete、has

// Map

// 是一种类似于字典的数据结构,本质上是键值对的集合
// 可以遍历,可以跟各种数据格式转换
// 操作方法有:set、get、has、delete、clear

// WeakMap

// 只接受对象作为键名(null 除外),不接受其他类型的值作为键名
// 键名是弱引用,键值可以是任意的,键名所指向的对象可以被垃圾回收,此时键名是无效的
// 不能遍历,方法有 get、set、has、delete
console 命令行工具 X clear

                    
>
console