博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
简述 Symbol 类型用途
阅读量:520 次
发布时间:2019-03-07

本文共 1156 字,大约阅读时间需要 3 分钟。

应用场景1:使用Symbol来作为对象属性名(key)

Symbol类型的key是不能通过Object.keys()或者for…in来枚举的,它未被包含在对象自身的属性名集合(property names)之中。所以,利用该特性,我们可以把一些不需要对外操作和访问的属性使用Symbol来定义。也正因为这样一个特性,当使用JSON.stringify()将对象转换成JSON字符串的时候,Symbol属性也会被排除在输出内容之外,我们可以利用这一特点来更好的设计我们的数据对象,让“对内操作”和“对外选择性输出”变得更加优雅。

应用场景2:使用Symbol来替代常量

我们经常定义一组常量来代表一种业务逻辑下的几个不同类型,我们通常希望这几个常量之间是唯一的关系,为了保证这一点,我们需要为常量赋一个唯一的值,有了Symbol,直接就保证了常量的值是唯一的了!

防止对象属性名称冲突let mySymbol = Symbol();// 第一种写法let a = {
};a[mySymbol] = 'Hello!';// 第二种写法let a = {
[mySymbol]: 'Hello!'};// 第三种写法let a = {
};Object.defineProperty(a, mySymbol, {
value: 'Hello!' });// 以上写法都得到同样结果a[mySymbol] // "Hello!"

应用场景3:使用Symbol定义类的私有属性/方法

使用它来定义的类属性是没有办法被模块外访问到的,可以达到了一个私有化的效果。

消除魔术字符串const shapeType = {
triangle: Symbol()};function getArea(shape, options) {
let area = 0; switch (shape) {
case shapeType.triangle: area = .5 * options.width * options.height; break; } return area;}getArea(shapeType.triangle, {
width: 100, height: 100 });

总结:

用于创建独一无二的值,可做唯一key用于缓存等场景
用于创建类的私有变量,利用symbol属性不能被枚举的特性声明作为私有属性
用来重置对象的属性,比如 Symbol.toStringTag
可实现 Symbol.iterator迭代器, 让普通对象变为可迭代对象
使用Symbol.for(‘xxx’)获取全局的symbol值

转载地址:http://szsnz.baihongyu.com/

你可能感兴趣的文章