∞拾年

ts
ES6 - SymbolSymbol 技术点基础作为属性名属性名的遍历symbol.for 和 symbol.ke...
扫描右侧二维码阅读全文
19
2021/09

ts

ES6 - Symbol

Symbol 技术点

  1. 基础
  2. 作为属性名
  3. 属性名的遍历
  4. symbol.for 和 symbol.keyFor
  5. 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)
Last modification:September 19th, 2021 at 12:24 pm
If you think my article is useful to you, please feel free to appreciate

Leave a Comment