ES6 - Symbol
Symbol 技术点
- 基础
- 作为属性名
- 属性名的遍历
- symbol.for 和 symbol.keyFor
- 11个内置symbol 的值
- Symbol 是独一无二的-基础
let a = Symbol() // a => Symbol()
let b = Symbol() // b => Symbol() a == b false
//传参
const c = symbol('lison') // symbol('lison')
const d = symbol('lison') // symbol('lison') c==d //false
//类型转换
d.toString() // 'symbol('lison')'
Boolen(d) //true
- symbol 作为属性名
let key = 'name'
const obj = {
name:'lis',
[key]:'lis'
}
const e = Symbol('name)
const _obj {
[e]:'lis
}
_obj[e] = 'edit' //symbol 只能用这种方式修改或获取
- Symbol 属性名的遍历
for(let i in _obj){} //遍历的key 不存在symbol 属性
_obj.keys() //不存在symbol 属性
Object.getOwnPropertyNames(_obj) //不存在symbol 属性
Json.stringify() //获取不到
//用下面方法可以获取到
Object.getOwnPropertySymbols(_obj) //可以获取到symbol属性 只获取Symbol集合
Reflect.ownKeys(_obj) //也可以获取到包含symbol 的所有属性集合
- Symbol 的两个静态方法
//Symbol.for() Symbol.keyFor()
const f = Symbol.for('lis')
const g = Symbol.for('lis') // f == g //true
const gg = Symbol.for('mm') // f == gg //false
Symbol.keyFor(f) //lis 只能取到 Symbol.for() 定义的key
Symbol.keyFor(d) //undefined
- Symbol 11个内置symbol 的值
// Symbol.hasInstance
const obj1 = {
[Symbol.hasInstance] (otherObj) {
console.log(otherObj) // {a:1}
}
}
console.log({a:1} instanceof <any>obj1) // {a:1} 上面log打印出 && false
let ar =[1,2]
console.log([].concat(ar,[3,4])) //[1,2,3,4]
ar[Symbol.isConcatSpreadable] = false
console.log([].concat(ar,[3,4])) //[[1,2],3,4] 数组不会被扁平化了
const obj2 = {
[Symbol.match] (string) {
console.log(string.length) // {a:1}
}
}
'abc'.match(<RegExp>obj2)