TypeScript (三) Symbol

/**
 * ES6 symbol 独一无二的值  两个Symbol值判断  false
 */

 const s1 = Symbol()
 console.log(s1) //Symbol()

 const s2 = Symbol('yp')  //yp 全局symbol的标识
 console.log(s2) // Symbol(yp)


 // symbol 不能做运算

 const s3 = Symbol('yp')
 console.log(s3.toString()) //Symbol(yp)
 console.log(!s3) //false

 let prop = 'name';
 const info = {
     [prop]:'yp'
 }
 console.log(info) //{name: "yp"}



 const s4 = Symbol('name');
 const info2 = {
     [s4]:'yp'
 }
 console.log(info2) //{Symbol(name): "yp"}
 info2[s4] = 'py'
 console.log(info2[s4]) //py
//  info2.s4 = '2'



const s5 = Symbol("age");
const info3 = {
    [s5]:24,
    name:'yp',
    sex:'man'
}
for(const key in info3){
    console.log(key) // name sex   没有s5(symbol值)
}

console.log(Object.keys(info3)) // (2) ["name", "sex"]
console.log(Object.getOwnPropertyNames(info3)) //(2) ["name", "sex"]
console.log(JSON.stringify(info3)) //{"name":"yp","sex":"man"}      //都获取不到symbol值作为的属性名

console.log(Object.getOwnPropertySymbols(info3)) //[Symbol(age)]

console.log(Reflect.ownKeys(info3)) //(3) ["name", "sex", Symbol(age)]


/**
 * Symbol.for() 查找之前有没有某个Symbol值,有就还赋给原先的值,没有就新建  全局
 */

 const s6 = Symbol('yp2');  
 const s7 = Symbol.for("yp2");
//  const s8 = Symbol.for("yp2");
//  console.log(s7=== s8)  // 浏览器运行true

/**
 * Symbol.keyFor() 查找Symbol.for创建的对应全局symbol值的标识
 */
console.log(Symbol.keyFor(s6));//undefinded
console.log(Symbol.keyFor(s7));//yp2


// 内置对象


/**
 * Symbol.hasInstance
 */
let obj1 = {
    [Symbol.hasInstance](otherObj){
        console.log(otherObj)   //{a: "a"}
    }
}
console.log({a:'a'} instanceof <any>obj1) // false

/**
 * Symbol.isConcatSpreadable
 */
let arr =[1,2]
console.log([].concat(arr,[3,4])) // (4) [1, 2, 3, 4] 扁平化

arr[Symbol.isConcatSpreadable] = false;
console.log([].concat(arr,[2,4]))  // (3) [Array(2), 2, 4]

/**
 *  Symbol.species  创建衍生对象
 */

// class C extends Array {  // 浏览器运行
//     getNum(){
//         return 'yp'
//     }
// }
// const c= new C(1,2,4)
// console.log(c)  //C(3) [1, 2, 4]

class C1 extends Array {
    constructor(...args) {
        super(...args)
    }
    getName() {
        return 'yp'
    }
}
const c1 = new C1(1,2,3,4)
const c11 = c1.map(item => item +1)
console.log(c11) // (4) [2, 3, 4, 5]
console.log(c11 instanceof C1)  //false    //浏览器true
console.log(c11 instanceof Array) // true


class C2 extends Array {
    constructor(...args) {
        super(...args)
    }
    static get [Symbol.species] (){
        return Array
    }
    getName() {
        return 'yp'
    }
}
const c2 = new C2(1,2,3,4)
const c22 = c2.map(item => item +1)
console.log(c22) // (4) [2, 3, 4, 5]
console.log(c22 instanceof C2)  //false
console.log(c22 instanceof Array) // true

/**
 * Symbol.match 字符串调用方法
 * 
 * Symbol.replace
 * 
 * Symbol.search
 * 
 * Symbol.split
 */

 let obj3 = {
     [Symbol.match] (string) {
         console.log(string.length)
     },
     [Symbol.split] (string) {
        console.log('split',string.length)
     }
 }
 'abcd'.match(<RegExp>obj3) //4

 'abcde'.split(<any>obj3)


 /**
  * Symbol.iterator 数组 遍历器方法 可改写
  */

  const arr0 = [1,2,3];

  const iterator = arr[Symbol.iterator]()

  console.log(iterator.next()) //{value: 1, done: false}
  console.log(iterator.next()) //{value: 2, done: false}
  console.log(iterator.next()) //{value: undefined, done: true}



   /**
  * Symbol.toPrimitive 转换其他类型
  */

let obj4:unknown = {
    [Symbol.toPrimitive](type){
        console.log(type)
    }
}
const res = (obj4 as number)++ //number

// const res = `abc${obj4}`  deault   //浏览器 string




/**
 * Symbol.toStringTag
 */

let obj5 = {
    [Symbol.toStringTag]:'yp'
}
console.log(obj5.toString()) //[object yp]


/**
 * Symbol.unscopables  哪些方法过滤掉
 */

 const obj6 = {  
     a:'a',
     b:'b'
 }
//  with(abj6){ //浏览器运行
//      console.log(a) //a
//      console.log(b)  //b
//  }

console.log(Array.prototype[Symbol.unscopables]) //{copyWithin: true entries: true fill: true find: true findIndex: trueflat: true flatMap: true includes: true keys: true values: true}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值