整理学习——ES6的Symbol

新的原始数据类型

在原有的六种数据类型(Undefined、Null、Boolean、String、Number、Object)的基础上,新增的代表一个独一无二的值的新的原始数据类型Symbol。

var s = Symbol([key])

不能使用new,会报错

let b = new Symbol();
//result: Uncaught TypeError: Symbol is not a constructor

参数key

Symbol([key])函数的参数可选,是用来对Symbol实例进行描述,对不同的Symbol类型以更明确的区分。
这个描述Symbol类型的参数是字符串,如果不是字符串,Symbol会调用参数的toString()函数将其转为字符串,但是不建议使用无含义的描述。这个参数即使是相同的参数,或者同样的没有参数,Symbol类型也是不同的,因为各自独一无二的存在。

const sym1 = Symbol("sym");
const sym2 = Symbol("sym");
sym1 == sym2;
//result: false

const symNum = Symbol(1);
const symBool = Symbol(true);
sym1;
//result: Symbol(sym)
symNum;
//result: Symbol(1)
symBool;
//result: Symbol(true)

转换

String

const sym = Symbol("symbolVal");
String(sym);
sym.toString();
//result: "Symbol(symbolVal)"

Boolean

const sym = Symbol("symbolVal");
Boolean(sym);
//true

Object

const sym = Symbol("symbolVal");
var obj = Object(sym);
obj
//result: Symbol {Symbol(symbolVal)}
obj.valueOf()
//result: Symbol(symbolVal)

作为对象属性名

可以保证不会出现同名的属性。

var sym = Symbol();
var obj = {
	[sym]: "symbol"
};
obj[sym];
//result: "symbol"

obj[sym] = 1;
obj[sym];
//result: 1

Object.defineProperty(obj, sym, {value: 2});
obj[sym];
//result: 2

属性

Symbol.length

长度属性,值为0

Symbol.prototype

描述Symbol构造函数的原型。

方法

Symbol.for([key])

接受一个字符串作为参数,搜索在全局范围中是否存在以该字符串作为描述的Symbol值。返回这个Symbol值。

var sym = Symbol.for("globalSym");
Symbol.for("globalSym");
//result: Symbol(globalSym)
与Symbol()的区别

Symbol()每次运行都是返回一个新值。
Symbol.for()每次运行不一定返回新的值。因为会先行检查给定的key是否已经存在,如果不存在才会新建。

sym == Symbol.for("globalSym");
//result: true
sym0 = Symbol.for("globalSym");
sym === sym0;
//result: true

var sym1 = Symbol("sym");
sym1 == Symbol("sym");
//result: false

Symbol.keyFor(sym)

从全局Symbol注册表中,为给定的Symbol值检索与其关联的键。不过只能搜索全局的Symbol值,也就是使用Symbol.for()创建的Symbol值。

var sym = Symbol.for("globalSym");
var sym2 = Symbol("sym");
Symbol.keyFor(sym);
//result: globalSym
Symbol.keyFor(sym2);
//result: undefined

内置Symbols

JavaScript内建了一些在ES5之前没有暴露给开发者的symbol,他们代表了内部语言行为。

迭代

Symbol.iterator

返回一个对象默认迭代器的方法。
for...of使用

Symbol.asyncIterator

返回一个对象默认的异步迭代器的方法。
for await of使用。
目前来说还不建议使用在生产环境当中

正则表达式

Symbol.match

用于对字符串进行匹配的方法,也用于确定一个对象是否可以作为正则表达式使用。
String.prototype.match()使用。

Symbol.replace

替换匹配字符串的子串的方法。
String.prototype.replace()使用

Symbol.search

返回一个字符串中与正则表达式相匹配的索引的方法。
String.prototype.search()使用

Symbol.split

匹配正则表达式的索引处拆分一个字符串的方法。
String.prototype.split()使用

其他

Symbol.hasInstance

确定一个构造器对象识别的对象是否为它的实例。
instanceof使用

Symbol.isConcatSpreadable

一个布尔值,表明一个对象是否应该展开为它的数组元素
Array.prototype.concat()使用

Symbol.toStringTag

用于对象的默认描述的字符串值。
Object.prototype.toString()使用。

Symbol.unscopables

拥有和继承属性名的一个对象的值被排除在与环境绑定的相关对象外。

Symbol.species

一个用于创建派生对象的构造器函数。

Symbol.toPrimitive

一个将对象转化为基本数据类型的方法。

Symbol原型

所有Symbol继承自Symbol.prototype。

属性

Symbol.prototype.constructor

返回创建实例原型的函数。
默认为Symbol函数

方法

Symbol.prototype.toSource()

返回包含Symbol对象源码的字符串
覆盖Object.prototype.toSource()方法

Symbol.prototype.toString()

返回包含Symbol描述符的字符串
覆盖Object.prototype.toString()方法

Symbol.prototype.valueOf()

返回Symbol对象的初始值
覆盖Object.prototype.valueOf()方法

Symbol.prototype[@@toPrimitive]

返回Symbol对象的初始值。

var sym = Symbol("sym");
sym[Symbol.toPrimitive]();
//resullt: Symbol(sym)

注意

  1. Symbol不能与任何类型进行任何运算
  2. Symbol不能转换为Number类型

参考网址:
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Symbol
http://caibaojian.com/es6/symbol.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值