第六章、Symbol和Symbol属性
1、创建Symbol
let firstName = Symbol();
Symbol是原始值,不可以使用new Symbol()创建
Symbol接受一个可选参数,为Symbol添加文本描述,描述被存储在[[Description]]属性,该属性不可直接在代码中访问,只有
调用Symbol的toString()方法才可以访问。
Symbol的辨别方法:typeof检测
let symbol = Symbol("test Symbol");
console.log(typeof symbol); //"symbol"
2、Symbol的使用方法
所有使用可计算属性名的地方,都可以使用Symbol。
Symbol也可以用于可计算对象字面量属性名、Object.defineProperty()方法黄蓉Object.defineProperties()方法的调用过程中。
3、Symbol共享体系
ES6提供了一个可以随时访问的全局Symbol注册表。
Symbol.for():创建一个可共享的Symbol。
接受一个参数,即将创建的Symbol的字符串标识符,同样也被用于Symbol的描述。
创建时首先在全局Symbol注册表搜索该键是否存在,存在即返回,否则创建且返回。
Symbol.keyFor():在Symbol全局注册表中检测与Symbol有关的键。
备注:Symbol全局注册表试营业类似于全局作用域的共享环境。当使用第三方组件时,尽量使用Symbol键的命名空间以减少命名冲突。
4、Symbol与类型强制转换
不能将Symbol强制转换为字符串或数字类型。
Symbol等价于布尔值true
5、Symbol属性检索
Object.keys():返回对象中所有可枚举的属性名。
Object.getOwnPropertyNames():返回对象中所有的属性名。
以上两个方法都不支持返回对象的Symbol属性。
Object.getOwnPropertySymbols():返回对象中所有的Symbol属性。
备注:对象可以从原型链中继承Symbol属性。
6、通过well-known Symbol暴露内部操作
ES6开放了JavaScript中常见的内部操作,并且通过预定义一些well-known Symbol来表示。
每一个这类Symbol都是Symbol对选哪个的一个属性。
这些well-known Symbol包括:
1、Symbol.hasInstance:一个在执行instanceof时调用的内部方法,可用于检测对象的继承信息。
2、Symbol.isConcatSpreadable:一个布尔值,用于表示传递一个集合作为Array.prototype.concat()方法的参数时,
是否应该讲集合内的元素规整到同一个层级。
3、Symbol.iterator:一个返回迭代器的方法。
4、Symbol.match:一个在调用String.prototype.match()方法时调用的内部方法,用于比较字符串。
5、Symbol.replace:一个在调用String.prototype.replace()方法时调用的内部方法,用于替换字符串的子串。
6、Symbol.search:一个在调用String.prototype.search()方法时调用的内部方法,用于在字符串中查找子串。
7、Symbol.species:用于创建派生对象的构造函数。
8、Symbol.split:一个在调用String.prototype.split()方法时调用的内部方法,用于分割字符串。
9、Symbol.toPrimitive:一个返回对象原始值的方法。
10、Symbol.toStringTag:一个在调用String.prototype.toString()方法时使用的字符串,用于创建对象描述。
11、Symbol.unscopables:一个定义了一些不可被with语句引用的对象属性名称的对象集合。