Symbol 理解和应用

Symbol

  • Symbol

    是第7个基础类型(表示独一无二)
    null,underfined,number,boolean,string,object,Symbol
    
  • 创建(不能直接通过new来创建)

    let sy1 = Symbol()  会返回不同对象
    let sy2 = Symbol("desction")   会返回不同对象 仅仅作为标识 用作标记调试
    let sy3 = Symbol.for("key") 会返回同一对象
    
    对象有点类似string 可以作为属性key
    
    let target = {}
    let sy1 = Symbol("one property")
    target[sy1] = "NNNN"
    console.log(target[sy1])
    
    > 不能使用.语法得到Symbol键的值
    > 会被forin Object.keys Object.getOwnPropertyNames 忽略
    > Object.getOwnPropertySymbols(xx) 得到 忽略系统内置Symbol
    
  • 系统默认Symbol 参考

    系统Symbol 如果对象包含该Symbol属性  会在执行时调用【见底 替换】 
    
    Symbol.hasInstance   instanceof 时候调用
    Symbol.isConcatSpreadable  boolean  Array.prototype.concat()时,是否可以展开
    Symbol.iterator  便利 for of 行为
    Symbol.match
    Symbol.prototype
    Symbol.replace 替换行为
    Symbol.search  
    Symbol.species
    Symbol.split 调用split时候调用
    Symbol.toPrimitive  类型转换时调用 a= { [Symbol.toPrimitive](){return 1}} ;a==1
    Symbol.toStringTag
    Symbol.unscopables
    
  • 应用

    • 枚举

       const MessageType = {
       	TextMessage:"TextMessage"
       	TextMessage:TextMessage:Symbol()
       }
      
    • 私有变量

      var o = {
      val: 10,
      [ Symbol("random") ]: "I'm a symbol",
      };
      
      class Person{
          let _pri = Symbol()
          constructor(){
              this[Symbol.for("private")] = "AA"
              this[this._pri] = ""
          }
          AA(){
              return this[Symbol.for("private")]
              return this[this._pri]
          }
      }
      
    • 修改系统默认方法

      • Symbol.replace

        [String] replace(searchValue: { [Symbol.replace](string: string, replaceValue: string): string; }, replaceValue: string): string;
        Dome : "ABCD".replace(source,"00")
         解释 :  会调用source的[Symbol.replace] 接受 "ABCD" 和 "00" 返回结果  并作为最终结果
         
         "A_B_C".replace("_","=") =>A=B=C
         "A_B_C".replace({
         	[Symbol.replace]:(source="A_B_C",target="=")=>{
         		return source+target
         	}
         },"=") => A_B_C=
         
        
      • Symbol.iterator

        返回一个对象 该对象实现iterator接口
        interface Iterator<T, TReturn = any, TNext = undefined> {
            next(...args: [] | [TNext]): IteratorResult<T, TReturn>;
            return?(value?: TReturn): IteratorResult<T, TReturn>;
            throw?(e?: any): IteratorResult<T, TReturn>;
        }
        用到该接口的地方
        	1:对对象进行结构赋值 对数组和 Set 结构进行解构赋值时  [...some] 
        	2:扩展运算符
        	3:yield* 
        
        class Student{
        	constructor() {
        		this.grades = [];
        	}
        	[Symbol.iterator]() {return this}
        	next() {
        		return {//进行中
        			done: false,
        			value: value
        		}
        		return {//结束
        			done: true,
        			value: undefined
        		}
        	}
        	[Symbol.iterator](){
        		var index = -1;				
        		return {
        			next(){
        				++index;
        				return {
        					done:index<this.grades.length,
        					value:this.grades[index]
        				}
        			}
        			
        		}
        	}
        }
        for(let key of me){}
        ==>
        const inter = me[Symbol.iterator]()
        inter.next()
        inter.next()
        inter.next() 直到 {done: true,value: undefined}
        
        var some = {}
        some[Symbol.iterator]=func *(){
        	yield 1;
        	yield 3;
        	yield 3;
        }
        for(let key of some){}
        const ss = [...some]
        
      • Symbol.hasInstance ==> instanceof

        class AAA{
        	static [Symbol.hasInstance](x){
        		return typeof x == 'number'
        	}
        	[Symbol.hasInstance](x){
        		return typeof x == 'number'
        	}
        }
        console.log(111 instanceof AAA)
        console.log(111 instanceof new AAA())
        
      • Symbol.toPrimitive 会在被转为原始值时调用

        class ABCD {
          	[Symbol.toPrimitive](hint) { 
          		hint 标识转为哪个原始值  hint的值‘string’,'number','default'
          		if(hint ==='string')return '-a-';
          		if(hint === 'number')return 100;
          		//default
          		return '[Object Abcd]'
          	}
        }
        const a = new ABCD();
        console.log(+a) // hint==='number'  // 100
        console.log(`${a}`) // hint === 'string'// '-a-'
        console.log(a+100,a+"11") // hint ==='default' 
        
        class ABCD {
          [Symbol.toPrimitive](hint) { 
            console.log("toPrimitive===1")
            return 1
            return 2
          }
          valueOf(){
            console.log("valueOf====2")
            return 1
          }
          toString() {
            console.log("toString===3")
            return 1
          }
        }
        const tar =new ABCD();
        //会调用 其中一个 (如果存在)
        //顺序为 Symbol.toPrimitive valueOf  toString
        1==tar //true
        
        (tar==1 && tar ==2)也可以同时成立 
        
        
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值