Symbol学习
Symbol是ES6引入的新的原始数据类型,表示独一无二的值,是Js语言的第七种数据类型
1、概述
Symbol的值通过Symbol函数生成,但是Symbol函数前不能使用new命令,否则会报错,因为Symbol是一个原始类型的值,不是对象,因此,不能添加属性,基本上,它是一种类似于字符串的数据类型如:
Symbol函数可以接受一个字符串作为参数,表示对Symbol实例的描述:
2、作为属性名的Symbol
每一个 Symbol 值都是不相等的,因此ymbol 值可以作为标识符,用于对象的属性名:
3、实例:消除魔术字符串
魔术字符串指的是,在代码之中多次出现、与代码形成强耦合的某一个具体的字符串或者数值。风格良好的代码,应该尽量消除魔术字符串,改由含义清晰的变量代替
4、属性名的遍历
Symbol 作为属性名,该属性不会出现在for…in、for…of循环中,也不会被**Object.keys()、****Object.getOwnPropertyNames()、JSON.stringify()**返回,Object.getOwnPropertySymbols方法返回一个数组,成员是当前对象的所有用作属性名的 Symbol 值。
使用Reflect.ownKeys方法可以返回所有类型的键名,包括常规键名和 Symbol 键名。
5、Symbol.for(),Symbol.keyFor()
Symbol.for()
Symbol.for能够重新使用同一个Symbol值,它接受一个字符串作为参数,然后搜索有没有以该参数作为名称的 Symbol 值。如果有,就返回这个 Symbol 值,否则就新建并返回一个以该字符串为名称的 Symbol 值
Symbol.keyFor
Symbol.keyFor方法返回一个已登记的 Symbol 类型值的key。
实例:模块的Singleton模式
Singleton 模式指的是调用一个类,任何时候返回的都是同一个实例。
内置的Symbol值
1、Symbol.hasInstance
对象的Symbol.hasInstance属性,指向一个内部方法。当其他对象使用instanceof运算符,判断是否为该对象的实例时,会调用这个方法。比如,foo instanceof Foo在语言内部,实际调用的是Foo[Symbol.hasInstance]foo。
Symbol.species
对象的Symbol.species属性,指向一个构造函数。创建衍生对象时,会使用该属性。
Symbol.match
对象的Symbol.match属性,指向一个函数。当执行str.match(myObject)时,如果该属性存在,会调用它,返回该方法的返回值。
Symbol.replace
对象的Symbol.replace属性,指向一个方法,当该对象被String.prototype.replace方法调用时,会返回该方法的返回值。
Symbol.search
对象的Symbol.search属性,指向一个方法,当该对象被String.prototype.search方法调用时,会返回该方法的返回值。
Symbol.split
对象的Symbol.split属性,指向一个方法,当该对象被String.prototype.split方法调用时,会返回该方法的返回值。
例子如下:
Symbol.iterator
对象的Symbol.iterator属性,指向该对象的默认遍历器方法。
ymbol.toPrimitive
对象的Symbol.toPrimitive属性,指向一个方法。该对象被转为原始类型的值时,会调用这个方法,返回该对象对应的原始类型值。
Symbol.toPrimitive被调用时,会接受一个字符串参数,表示当前运算的模式,一共有三种模式。
- Number:该场合需要转成数值
- String:该场合需要转成字符串
- Default:该场合可以转成数值,也可以转成字符串
-
Symbol.toStringTag
对象的Symbol.toStringTag属性,指向一个方法。用来定制[object Object]或[object Array]中object后面的那个字符串。
Symbol.unscopables
对象的Symbol.unscopables属性,指向一个对象。该对象指定了使用with关键字时,哪些属性会被with环境排除。