什么是Symbol
- Symbol是ES6新增的数据类型,符号是原始值,符号的实例是唯一的、不可变的。符号用来创建唯一记号,进而用作非字符串形式的对象属性。
基本用法
let test = Symbol();
也可以传入字符串参数来作为符号的描述,可以通过此字符串来调试代码:let test1 = Symbol('test1');
Symbol()
不能与new关键字一起作为构造函数使用,Symbol属于基本数据类型,不是构造函数
全局符号注册表 Symbol.for()
- 使用全局符号注册表可以给不同部分需要共享和重用符号的实例共用,以一个字符串为键,在全局符号注册表中创建并重用。(必须使用字符串创建)
- 示例:
let test1 = Symbol.for('test');
let test2 = Symbol.for('test');
consolo.log(test1 === test2);
- 注意:全局符号注册表定义的符号和
Symbol()
定义的不同
let test1 = Symbol('test');
let test2 = Symbol.for('test');
console.log(test1 === test2);
- 可以使用
Symbol.keyFor()
来查询全局注册表,该方法接收符号,返回该全局符号对于的字符串。若查询的不是全局符号注册表,返回undefined
let symbol1 = Symbol('test');
let symbolFor1 = Symbol.for('test');
console.log(Symbol.keyFor(symbolFor1));
console.log(Symbol.keyFor(symbol1));
可以使用符号作为属性
- 凡是可以使用字符串或者数值作为属性的地方,都可以使用符号。
- 例:
let t1 = Symbol('test1');
let t2 = Symbol('test2');
let o ={
[t1]: 'a test'
}
Object.defineProperty(o, t2, {
value: 't2 test',
enumerable: true
});
console.log(o);
常用内置符号
- 这些内置符号都以Symbol工厂函数字符串属性的形式存在
- 重要用途之一:重新定义从而改变原生结构的行为
- 所有内置符号都是不可写,不可枚举,不可配置的
- 注:符号在规范中的名称,前缀为
@@
。如:@@iterator
表示Symbol.iterator
Symbol.asynclterator
Symbol.asynclterator
符号指定了一个对象的默认异步迭代器。如果一个对象设置了这个属性,它就是异步可迭代对象,可用于for await of循环- 详见MDN文档
Symbol.hasInstance
- 由
instanceof
使用
Symbol.iterator
- 由
Symbol.iterator
函数生成的对象可以通过显示调用next()方法返回值,也可隐式通过生成器函数返回
Symbol.match
- 由
String.prototype.match()
方法使用 String.prototype.match()
方法会使用以Symbol.match
为键的函数来对正则表达式求值- 例:
console.log('mytest'.match(/my/));
Symbol.replace
- 由
String.prototype.replace()
方法使用 - 传入2个参数,欲被替换数据,新数据,可以将相应数据替换为所传入的新数据
- 例:
console.log('i create a test'.replace('i','you'));
Symbol.species
- 是个函数值属性,其被构造函数用以创建派生对象。
- 详见MDN文档
Symbol.split
- 由
String.prototype.split()
方法使用 - 作用:在相应匹配的索引位置拆分字符型
- 例:
console.log('study'.split('u'));
Symbol.toPrimitive
- 是一个内置的 Symbol 值,它是作为对象的函数值属性存在的,当一个对象转换为对应的原始值时,会调用此函数。
- 详见MDN文档
Symbol.toStringTag
- 由
Object.prototype.toString()
使用 - 作用:返回一个表示该对象的字符串
- 例:
function Test(name){
this.name = name;
}
const test = new Test('test');
console.log(test);
console.log(test.toString());
Symbol.unscopables
- 指用于指定对象值,其对象自身和继承的从关联对象的 with 环境绑定中排除的属性名称。
- 详见MDN文档