Symbol
一种标识 / 符号 ,表示独一无二的
const s1 = Symbol()
const s2 = Symbol()
console.log(s1 === s2) // false
description ~ 描述、只读不可写,对象结构的描述会自动调用 toString()
const s1= Symbol('zhangsan')
console.log(s1.description) // zhangsan
const obj = { name: 'zhangsan' }
const s2 = Symbol(obj) // Symbol([object Object])
Symbol.for ~ 全局定义,会匹配是否有相同的描述
const s4 = Symbol.for('foo')
const s5 = () => {
return Symbol.for('foo')
}
console.log(s4 === s5()) // true
keyFor ~ 全局寻找是否定义过
const s = Symbol.for('lisi')
console.log(Symbol.keyFor(s)) // lisi
- Object.getOwnPropertySymbols : 类似 getOwnPropertyNames,但只能获取 symbol 类型键值对
- Reflect.ownKeys 可获取所有类型的键值对
const address = Symbol()
const obj = {
name: 'zs',
[address]: 'li'
}
Object.getOwnPropertySymbols(obj).map(item => {
console.log(item)
})
魔法字符串
const type = {
triangle: Symbol(), // 这里并不关心对应的值
circle: Symbol()
}
function getNumber(val) {
let num = 0
switch (val) {
case type.triangle:
num = 1
break
case type.circle:
num = 2
break
}
return num
}
Set
- 集合、唯一不可重复的类数组、没有 key ,或者说 key 和 value 一样, api 可链式
.add()
添加、修改.delete()
删除.has()
是否存在.clear()
清空.size
长度
const s = new Set([1, 2, 3, 3, 3, 3])
console.log(s) // [1,2,3]
console.log(s instanceof Set) // true
WeakSet
- 弱引用,只能用对象类型 value,没有 size ,无法遍历
.add()
添加、修改.delete()
删除.has()
是否存在
const weakSet = new WeakSet()
const obj1 = { name: 'obj1' }
const obj2 = { name: 'obj2' }
weakSet.add(obj1)
weakSet.add(obj2)
MAP
- 唯一值的有序数据结构,可以任意类型值作为 key
set
设置get
获取has
是否存在delete
删除size
长度clear
清空
const map = new Map([
['age', 18],
['name', 'zhangsan']
])
WeakMap
- 弱引用,键只能是对象类型,无法遍历,没有 size
.has
是否存在.set
添加.delete
删除
const wm = new WeakMap()
const elem = document.getElementsByTagName('h1')
wm.set(elem, 'info')