ES6 Symbol

Posted gootter

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ES6 Symbol相关的知识,希望对你有一定的参考价值。

基本概念

javascript的第七种数据类型

var s=Symbol();

Symbol()===Symbol() //false

Symbol("foo")===Symbol("foo") //false

typeof Symbol==="symbol" //true

注意点

(1)Symbol()中的参数是该Symbol的描述。传入对象时会自动调用toString()方法转换为字符串。

(2)Symbol()定义对象的属性时,需要用方括号设置或读取。.运算符后面总是字符串,而Symbol()类型不是字符串。

(3)获取对象的Symbol()类型属性时,调用Object.getOwnPropertySymbols方法或Reflect.ownKeys方法。Reflect.ownKeys返回的是Object.getOwnPropertySymbols()+Object.getOwnProperties()。

(4)symbol的弱封装机制:模块创建了几个symbol,可以在任意对象上使用,无须担心与其它代码创建的属性产生冲突。

API

Symbol.for()

相同点:都能成一个新Symbol()

不同点:新创建的Symbol.for()会注册在symbol表中,该symbol注册表不包括Symbol()定义的symbol。第二次调用时直接在symbol注册表中查询。Symbol.keyFor() 用来获取注册表Symbol类型值的key。

内置Symbol

Symbol.iterator

指向对象默认的遍历器方法,for...of循环时,会调用该方法

Symbol.hasInstance    

调用obj instanceof Object 相当于调用了 Object[Symbol.hasInstance](obj)

Symbol.isConcatSpreadable

用来定义对象是否能够展开,默认undefined,可转化为true可展开,设置false不能展开

Symbol.species

在基类上修改的类库,在使用继承方法时,返回的是子类的实例,如果想返回基类的实例,可以在子类中定义存取器get [Symbol.species](){return parent}来实现

Symbol.toStringTag

定制调用toString方法返回[object xxx]中的xxx  [object 对象的类型] 为Object.prototype.toString的返回值,可用来确定对象的类型,比typeof要准确

Symbol.unscopables

对象的Symbol.unscopables属性,指向一个对象。该对象指定了使用with关键字时,哪些属性会被with环境排除。

相似API

Symbol.match | Symbol.replace | Symbol.search | Symbol.split

ES5的String.prototype.match(obj)会自动将obj转换成一个RegExp正则表达式对象。现在我们可以传入一个自定义的包含Symbol.match方法的类来匹配。

Symbol.toPrimitive

对象的Symbol.toPrimitive属性,指向一个方法。该对象被转为原始类型的值时,会调用这个方法,返回该对象对应的原始类型值。

用法

(1)消除魔术字符串,类似于枚举对象

(2)消除新旧代码的冲突,Symbol.unscopables

(3)使instanceof可扩展,Symbol.hasInstance

(4)支持新的字符匹配类型,Symbol.match

以上是关于ES6 Symbol的主要内容,如果未能解决你的问题,请参考以下文章

ES6(Symbol)

ES6:模板字符串&函数&进制&Symbol数据结构

ES6:模板字符串&函数&进制&Symbol数据结构

ES6 Symbol

ES6 Symbol

##ES6之Symbol