Symbol
1.概述
es6引入的一种新的原始数据类型(目前共7种数据类型,Object对象,以及6种原型数据类型:Undefined,Null,Number,String,Boolean,Symbol),表示独一无二的值;
引入原因:防止属性名的冲突
使用:
let symbol_example=Symbol(symbol_description); //可以接受一个字符串作为参数,只是表示对Symbol实例的描述,以便区分;---注意:即使两个Symbol实例的描述相同,这两个实例也不会相等
symbol_example.toString(); //Symbol(symbol_description)
注意:
1)Symbol值不能参与运算,会报错
2)Symbol值可以转换成字符串
symbol.toString(); 或 String(symbol);
3)Symbol值可以转换为boolean值,但不能转换成Number值
2.作为属性名
三种写法:
注意,不能使用.运算符,如a.mySymbol会报错,必须放在[]中Symbol值作为属性名时,该属性还是公开属性,而不是私有属性
3.实例:消除魔术字符串
--降低代码的耦合
常用的消除魔术字符串的方法,就是把它写成一个变量
魔术字符串例子利用Symbol改写如下:
4.属性名的遍历
可以获取Symbol属性名的方法有:
1)Object.getOwnPropertySymbols(obj)
2)新的API:Reflect.ownKeys()--返回所有类型的键名,包括常规键名和 Symbol 键名
Reflect.ownKeys()例子由于以 Symbol 值作为名称的属性,不会被常规方法遍历得到。我们可以利用这个特性,为对象定义一些非私有的、但又希望只用于内部的方法??
5.Symbol.for(),Symbol.keyFor()
Symbol.for():可以实现重新使用同一个Symbol值,可以接受一个字符串参数,若有以该参数作为名称的 Symbol 值,就返回Symbol值,否则就创建一个;
Symbol.for()的使用示例Symbol.keyFor():返回一个已登记的 Symbol 类型值的key
Symbol.keyFor()的使用示例需要注意的是,Symbol.for为 Symbol 值登记的名字,是全局环境的,可以在不同的 iframe 或 service worker 中取到同一个值
6.实例:模块的singleton模式
singleton模式:调用一个类,任何时候返回的都是同一个实例
例子是node模块文件的??
7.内置的Symbol值--内部使用的方法
ES6 提供了 11 个内置的 Symbol 值,指向语言内部使用的方法???
(1)Symbol.hasInstance属性,指向一个内部方法。当其他对象使用instanceof运算符,判断是否为该对象的实例时,会调用这个方法
(2)Symbol.isConcatSpreadable
该属性等于一个布尔值,表示该对象用于Array.prototype.concat()时,是否可以展开
(3)Symbol.species
(4)Symbol.match
(5)Symbol.replace
(6)Symbol.search
(7)Symbol.split
(8)Symbol.iterator (遍历器方法)
(9)Symbol.toPrimitive
(10)Symbol.toStringTag
(11)Symbol.unscopables with关键字
网友评论