symbol数据类型以及应用场景

在js中,Symbol是一种基本数据类型,是在ECMAScript 6 (ES6) 中引入的新特性。表示独一无二

Symbol的定义

Symbol是不完整的构造函数,创建symbol对象时不需要new操作符,原因是通过 new 实例化的结果是一个 object 对象,而不是原始类型的 symbol。

var s = Symbol()
typeof s // 'symbol'

Symbol 方法接收一个参数,表示对生成的 symbol 值的一种描述。

var a = Symbol('a')
var b = Symbol('b')
a==b //false

即使是传入相同的参数,生成的 symbol 值也是不相等的,因为 Symbol 本来就是独一无二的意思。

Symbol的应用

  1. 作为对象的属性
    可以作为对象的属性来解决属性覆盖问题,避免引发不必要的代码冲突
var a = Symbol('a')let obj = {}obj[a] = 'test'obj // {Symbol(a): 'test'}

值得注意的是我们无法使用".“来调用对象的Symbol属性,所以必须使用”[]"来访问Symbol属性

  1. 降低代码耦合
    当代码中充斥着大量的魔法字符时,纵使是原开发者在经过一段时间后再回头看也会变得难以理解,更不必说是交由后来开发者维护。

假如现有一个 Tabs 切换的功能:

if (type === 'basic') {return <div>basic tab</div>
}if (type === 'super') {return <div>super tab</div>
}

上面代码中字符串 basic、super 就是与业务代码无关的魔法字符,接下来使用 Symbol 对这块代码进行改造。

const tabTypes = {basic: Symbol(),super: Symbol(),
}if (type === tabTypes.basic) {return <div>basic tab</div>
}if (type === tabTypes.super) {return <div>super tab</div>
}

全局共享Symbol

如果我们想创建一个可供全局使用的symbol,那么我们需要用Symbol.for(),可以传递一个参数作为描述,该方法可以遍历全局注册表中的的Symbol,当搜索到相同描述,那么会调用这个Symbol,如果没有搜索到,就会创建一个新的Symbol。

const a = Symbol.for('a')
const b = Symbol.for('a')
a === b // true

过程解析

1、首先通过Symbol.for()在全局注册表中寻找描述为a的Symbol,而目前没有符合条件的Symbol,所以创建了一个描述为a的Symbol
2、当声明b并使用Symbol.for()在全局注册表中寻找描述为a的Symbol,找到并赋值
3、比较a与b结果为true反映了Symbol.for()的作用

再来看看下面一段代码

const a = Symbol('a')
const b = Symbol.for('a')
a === b // false

结果是false,与上面的区别仅仅在于第一个Symbol的创建方式,我们来分析。

1、使用Symbol(‘a’)直接创建,所以该Symbol(‘a’)不在全局注册表中
2、使用Symbol.for(‘a’)在全局注册表中寻找描述为a的Symbol,并没有找到,所以在全局注册表中又创建了一个描述为a的新的Symbol
3、秉承Symbol创建的唯一特性,所以a与b创建的Symbol不同,结果为false

Symbol.keyFor()获取全局注册表变量的描述

const a = Symbol('a')
const b = Symbol.for('a')
Symbol.keyFor(a) // undefined
Symbol.keyFor(b) // a

symbol对象不能用于数据运算,包括+、-、*、/等

const a = Symbol('a')
a+0 //Uncaught TypeError: Cannot convert a Symbol value to a number

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/42685.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STL--栈(stack)

stack 栈是一种只在一端(栈顶)进行数据插入(入栈)和删除(出栈)的数据结构,它满足后进先出(LIFO)的特性。 使用push(入栈)将数据放入stack,使用pop(出栈)将元素从容器中移除。 使用stack,必须包含头文件: #include<stack>在头文件中,class stack定义如下: namespace std…

Druid 连接池在很多方面表现出色,但在实际应用中也可能会遇到一些缺陷或问题。

Druid 连接池是阿里巴巴开源的一个功能强大的数据库连接池&#xff0c;它具有高性能、可靠性、可管理性、安全性和扩展性等特点。然而&#xff0c;尽管 Druid 连接池在很多方面表现出色&#xff0c;但在实际应用中也可能会遇到一些缺陷或问题。 1. **连接耗尽问题**&#xff1…

13 - matlab m_map地学绘图工具基础函数 - 介绍创建管理颜色映射的函数m_colmap和轮廓图绘制颜色条的函数m_contfbar

13 - matlab m_map地学绘图工具基础函数 - 介绍创建管理颜色映射的函数m_colmap和轮廓图绘制颜色条的函数m_contfbar 0. 引言1. 关于m_colmap2. 关于m_contfbar3. 结语 0. 引言 本篇介绍下m_map中用于创建和管理颜色映射函数&#xff08;m_colmap&#xff09;和 为轮廓图绘制颜…

基于深度学习的电影推荐系统

1 项目介绍 1.1 研究目的和意义 在电子商务日益繁荣的今天&#xff0c;精准预测商品销售数据成为商家提升运营效率、优化库存管理以及制定营销策略的关键。为此&#xff0c;开发了一个基于深度学习的商品销售数据预测系统&#xff0c;该系统利用Python编程语言与Django框架&a…

SQLite 命令行客户端 + Windows 批处理应用

SQLite 命令行客户端 Windows 批处理应用 下载 SQLite 客户端1. Bat 辅助脚本1. 执行SQL.bat执行 2. 导出Excel.bat执行效果 3. 导出HTML.bat执行效果 4. 清空-订单表.bat5. 订单表.bat 2. 测试 SQL1. 创建订单表.sql2. 插入订单表.sql3. 查询订单表.sql4. 清空订单表.sql5. 删…

Qt Qwt 图表库详解及使用

文章目录 Qt Qwt 图表库详解及使用一、Qwt 概述二、安装 Qwt1. 下载和编译 Qwt2. 在项目中使用 Qwt三、Qwt 的基本使用1. 创建一个简单的折线图2. 添加图例和自定义样式四、Qwt 的交互功能1. 启用缩放和平移2. 启用数据点选择五、Qwt 的高级特性1. 实时数据更新2. 多轴绘图六、…

nvm 管理多版本 node

1、下载 先不安装node 下载 nvm 1.1.10-setup.zip 解压&#xff1a;nvm&#xff1a;https://nvm.uihtm.com/ 新建nodejs/node、nodejs/nvm文件夹用于存放node版本和nvm安装路径 安装nvm&#xff1a;上述链接有安装教程 查看是否安装成功&#xff1a;重新打开cmd 输入 nvm nv…

Hyper-V克隆虚拟机教程分享!

方法1. 使用导出导入功能克隆Hyper-V虚拟机 导出和导入是Hyper-V服务器备份和克隆的一种比较有效的方法。使用此功能&#xff0c;您可以创建Hyper-V虚拟机模板&#xff0c;其中包括软件、VM CPU、RAM和其他设备的配置&#xff0c;这有助于在Hyper-V中快速部署多个虚拟机。 在…

深入理解基本数据结构:数组详解

引言 在计算机科学中&#xff0c;数据结构是存储、组织和管理数据的方式。数组作为最基础的数据结构之一&#xff0c;广泛应用于各种编程场景。在这篇博客中&#xff0c;我们将详细探讨数组的定义、特点、操作及其在不同编程语言中的实现。 什么是数组&#xff1f; 数组是一种…

原生android的内存性能提升方面的方案大致设计

一 测试目标&#xff1a; 以满足用户设备的内存性能和不杀后台为目标。 1&#xff1a;满足用户设备的内存性能是指不出现因为内存原因导致的安卓设备死机&#xff0c;卡顿等问题。 2&#xff1a;满足不杀后台是指整个设备使用时&#xff0c;不出现后台app被杀。 通常是估算如果…

构造函数注入@RequiredArgsConstructor

Api(tags "用户管理接口") RequiredArgsConstructor RestController RequestMapping("users") public class UserController {private final IUserService userService;PostMappingApiOperation("新增用户")public void saveUser(RequestBody U…

输入框输入值之后,检索表格中是否存在输入框中的值,存在就让当前文字为红色

this.searchValue为输入框的值 createKeywordHtml_content(data) { if (data undefined) { return data; } if (typeof data ! string) { data String(data) } let value data.replace(this.searchValue, <span style"color:#FF5555">$&</span>…

来一组爱胜品1133DN PRO打印机的照片

刚拆箱的机器正面照片 打开前盖正准备要安装原装耗材 下图是原装耗材&#xff0c;硒鼓型号是DR2833、碳粉盒型号是TN2833,鼓组件打印页数12000页&#xff0c;TN2833标准容量粉盒打印页数1600页/5%覆盖率&#xff0c;TN2833H大容量粉盒打印页数3000页/5%覆盖率、TN2833L超大容量…

Intel base instruction -- cvttsd2si

将截断双精度浮点数并转换为有符号整数。 4958: 8b 05 82 49 00 00 mov 0x4982(%rip),%eax # 92e0 <age_to_colorBase> // eaxgvar_92e0 495e: 48 8d 15 7b 49 00 00 lea 0x497b(%rip),%rdx # 92e0 <age_to_colorBase&g…

慢性肾脏病-MR+转录组文献

Identification of novel therapeutic targets for chronic kidney disease and kidney function by integrating multi-omics proteome with transcriptome - PMC (nih.gov) 数据和材料 Our pQTL summary data were acquired from previously published studies and can be f…

三. 根文件系统构建

根文件系统构建好以后就意味着我们已经拥有了一个完整的,可以运行的最小系统. 一. 根文件系统简介 根文件系统一般也叫做 rootfs&#xff0c;那么什么叫根文件系统&#xff1f;Linux 中的根文件系统更像是一个文件夹或者叫做目录,在这个目录里面会有很多的子目录,目录下的文件…

《妃梦千年》第二十九章:朝中波澜

第二十九章&#xff1a;朝中波澜 自从被封为护国夫人后&#xff0c;林清婉在大周的地位愈发稳固&#xff0c;她的智慧和勇气不仅赢得了皇上的信任&#xff0c;也获得了朝中众臣的敬佩。然而&#xff0c;这也引来了部分人的嫉妒和不满&#xff0c;他们开始在暗中谋划&#xff0…

AdaBoost集成学习算法理论解读以及公式为什么这么设计?

本文致力于阐述AdaBoost基本步骤涉及的每一个公式和公式为什么这么设计。 AdaBoost集成学习算法基本上遵从Boosting集成学习思想&#xff0c;通过不断迭代更新训练样本集的样本权重分布获得一组性能互补的弱学习器&#xff0c;然后通过加权投票等方式将这些弱学习器集成起来得到…

RightFont 8.7.0 Mac专业字体管理工具

RightFont 适用于 macOS 的终极字体管理器应用程序&#xff0c;提供无缝的字体管理体验。它结合了速度、直观的功能和专业的功能&#xff0c;使用户能够轻松预览、安装、组织和共享字体。 RightFont 8.7.0 Mac下载 RightFont 8.0的新增功能 RightFont 8.0 带来了全新的智能选…

【电脑应用技巧】如何寻找电脑应用的安装包华为电脑、平板和手机资源交换

电脑的初学者可能会直接用【百度】搜索电脑应用程序的安装包&#xff0c;但是这样找到的电脑应用程序安装包经常会被加入木马或者强制捆绑一些不需要的应用装入电脑。 今天告诉大家一个得到干净电脑应用程序安装包的方法&#xff0c;就是用【联想的应用商店】。联想电脑我是一点…