2018-01-16 -02 ES6 阮一峰教程摘记7 Symbol

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关键字

你可能感兴趣的:(2018-01-16 -02 ES6 阮一峰教程摘记7 Symbol)