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的主要内容,如果未能解决你的问题,请参考以下文章