码迷,mamicode.com
首页 > 其他好文 > 详细

ES6 Symbol

时间:2018-09-01 17:31:17      阅读:132      评论:0      收藏:0      [点我收藏+]

标签:一个   机制   tostring   sea   type   转换   设置   regex   fine   

基本概念

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

标签:一个   机制   tostring   sea   type   转换   设置   regex   fine   

原文地址:https://www.cnblogs.com/goOtter/p/9570317.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!