Symbol学习记录

什么是Symbol

  • Symbol是ES6新增的数据类型,符号是原始值,符号的实例是唯一的、不可变的。符号用来创建唯一记号,进而用作非字符串形式的对象属性。

基本用法

  1. let test = Symbol(); 也可以传入字符串参数来作为符号的描述,可以通过此字符串来调试代码:let test1 = Symbol('test1');
  2. Symbol()不能与new关键字一起作为构造函数使用,Symbol属于基本数据类型,不是构造函数

全局符号注册表 Symbol.for()

  1. 使用全局符号注册表可以给不同部分需要共享和重用符号的实例共用,以一个字符串为键,在全局符号注册表中创建并重用。(必须使用字符串创建)
  2. 示例:
	let test1 = Symbol.for('test');
    let test2 = Symbol.for('test');
    consolo.log(test1 === test2); //true
  • 注意:全局符号注册表定义的符号和Symbol()定义的不同
 	let test1 = Symbol('test');
    let test2 = Symbol.for('test');
    console.log(test1 === test2); //false
  1. 可以使用Symbol.keyFor()来查询全局注册表,该方法接收符号,返回该全局符号对于的字符串。若查询的不是全局符号注册表,返回undefined
	let symbol1 = Symbol('test');
	let symbolFor1 = Symbol.for('test');
	console.log(Symbol.keyFor(symbolFor1)); //test
	console.log(Symbol.keyFor(symbol1)); //undefined

可以使用符号作为属性

  1. 凡是可以使用字符串或者数值作为属性的地方,都可以使用符号。
  2. 例:
      let t1 = Symbol('test1');
      let t2 = Symbol('test2');
      let o ={
        [t1]: 'a test'
      }
      Object.defineProperty(o, t2, {
        value: 't2 test',
        enumerable: true //默认为false,设置为true才可以枚举出
      });
      console.log(o); //{ [Symbol(test1)]: 'a test', [Symbol(test2)]: 't2 test' }
    

常用内置符号

  1. 这些内置符号都以Symbol工厂函数字符串属性的形式存在
  2. 重要用途之一:重新定义从而改变原生结构的行为
  3. 所有内置符号都是不可写,不可枚举,不可配置的
  • 注:符号在规范中的名称,前缀为@@。如:@@iterator表示Symbol.iterator

Symbol.asynclterator

  1. Symbol.asynclterator符号指定了一个对象的默认异步迭代器。如果一个对象设置了这个属性,它就是异步可迭代对象,可用于for await of循环
  2. 详见MDN文档

Symbol.hasInstance

  1. instanceof使用

Symbol.iterator

  1. Symbol.iterator函数生成的对象可以通过显示调用next()方法返回值,也可隐式通过生成器函数返回

Symbol.match

  1. String.prototype.match()方法使用
  2. String.prototype.match()方法会使用以Symbol.match为键的函数来对正则表达式求值
  3. 例:
      console.log('mytest'.match(/my/)); // [ 'my', index: 0, input: 'mytest', groups: undefined ]
    

Symbol.replace

  1. String.prototype.replace()方法使用
  2. 传入2个参数,欲被替换数据,新数据,可以将相应数据替换为所传入的新数据
  3. 例:
      console.log('i create a test'.replace('i','you')); // you create a test
    

Symbol.species

  1. 是个函数值属性,其被构造函数用以创建派生对象。
  2. 详见MDN文档

Symbol.split

  1. String.prototype.split()方法使用
  2. 作用:在相应匹配的索引位置拆分字符型
  3. 例:
      console.log('study'.split('u')); // [ 'st', 'dy' ]
    

Symbol.toPrimitive

  1. 是一个内置的 Symbol 值,它是作为对象的函数值属性存在的,当一个对象转换为对应的原始值时,会调用此函数。
  2. 详见MDN文档

Symbol.toStringTag

  1. Object.prototype.toString()使用
  2. 作用:返回一个表示该对象的字符串
  3. 例:
      function Test(name){
          this.name = name;
      }
      const test = new Test('test');
      console.log(test); // Test { name: 'test' }
      console.log(test.toString()); // [object Object]
    

Symbol.unscopables

  1. 指用于指定对象值,其对象自身和继承的从关联对象的 with 环境绑定中排除的属性名称。
  2. 详见MDN文档
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值