typescript-Symbol(四)

基础

  • 每个Symbol值是独一无二的
  • Symbol不能和其他类型的值做运算
    const s4 = Symbol('数组')
    console.log(s4.toString())//Symbole(数组)
    console.log(Boolean(s4))//true
    console.log(!s4)//false
    

作为属性名

let prop = 'name'
const objs = {
  //name: 'Ailke'
  [`my${prop}`]: 'Ailke'
}
console.log(objs)//{myname: 'Ailke'}
const uname = Symbol('username')
const info = {
  [uname]: 'Ailke',
  age: 18,
  address: '成都市成华区'
}
console.log(info)// {age: 18, address: '成都市成华区', Symbol(username): 'Ailke'}
//只能通过[属性名]获取值
console.log(info[uname])//Ailke

属性名的遍历

// 遍历  无法获取smybol值
for(const key in info){
  console.log(key)//age  address
}

//获取对象的属性名构成的数组  无法获取smybol值
console.log(Object.keys(info))//["age","address"]

//获取对象的属性名构成的数组  无法获取smybol值
console.log(Object.getOwnPropertyNames(info)) //["age","address"]
//将对象转化为JSON 无法获取smybol值
console.log(JSON.stringify(info))//{"age": "18","address": "成都市成华区"}

//获取smybol类型的对象名
console.log(Object.getOwnPropertySymbols(info))// [Symbol(username)]

//获取对象中任意类型的属性名构成数组
console.log(Reflect.ownKeys(info))// [Symbol(username),"age","address"]

Symbol.for和Symbol.keyFor

Symbol.for

//Symbol.for创建的变量,如果变量的内容一致,首先会直接去引用,而不会创建新的变量
const str1 = Symbol.for('数组')
const str2 = Symbol.for('数组')

Symbol.keyFor

const str = Symbol('数组')
const str1 = Symbol.for('数组')
console.log(Symbol.keyFor(str))// undefined
console.log(Symbol.keyFor(str1))// 数组

11个内置Symbol值

Symbol.hasInstance

  • Symbol.hasInstance用于判断某对象是否为某构造器的实例
    const object = {
      [Symbol.hasInstance] (otherObj: any){
        console.log(otherObj)//{a: 'a'}
      }
    }
    console.log({a: 'a'} instanceof (object as any))//false
    

Symbol.isConcatSpreadable

  • Symbol.isConcatSpreadable符号用于配置某对象作为Array.prototype.concat()方法的参数时是否展开其数组元素
    let arrNum: Array<any>
    arrNum = [1,5,2]
    let newArr: Array<any>
    newArr = []
    console.log(newArr.concat(arrNum,[3,4]))//[1,5,2,3,4]
    arrNum[Symbol.isConcatSpreadable as unknown as number] = false
    console.log(newArr.concat(arrNum,[3,4]))//[Array[1,5,2],3,4]
    
  • 知识点: as unknown as ** 等效于 as any

Symbol.species

  • Symbol.species 是个函数值属性,其被构造函数用以创建派生对象。species 访问器属性允许子类覆盖对象的默认构造函数
     class Ar extends Array{
      constructor(...args: any){
        super(...args)
      }
      //自定义返回实例类型
      static get [Symbol.species] () {
        return Array
      }
      getName(){
        return 'Ailke'
      }
    }
    const arre = new Ar(1,2,3)
    const arrx = arre.map(item => item * item)
    console.log(arre)//[1,2,3]
    console.log(arrx)//[1,4,9]
    console.log(arrx instanceof Ar)//false
    console.log(arrx instanceof Array)//true
    

Symbol.match

  • Symbol.match指定匹配的是正则表达式而不是字符串
    let obt = {
      [Symbol.match] (string: string){
        console.log(string.length)//5
      }
      [Symbol.split] (string: string){
      	console.log(string.length)//4
      }
    }
    'abcde'.match(<RegExp>obt)
    'ferw'.split(<any>obt)
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值