es6关于Symbol 独一无二的值(2024-04-12)

1、介绍

ES5 的对象属性名都是字符串,这容易造成属性名的冲突。比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法(mixin 模式),新方法的名字就有可能与现有方法产生冲突。如果有一种机制,保证每个属性的名字都是独一无二的就好了,这样就从根本上防止属性名的冲突。这就是 ES6 引入Symbol的原因。

ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值。它属于 JavaScript 语言的原生数据类型之一,其他数据类型是:undefinednull、布尔值(Boolean)、字符串(String)、数值(Number)、大整数(BigInt)、对象(Object)。

Symbol 值通过Symbol()函数生成。这就是说,对象的属性名现在可以有两种类型,一种是原来就有的字符串,另一种就是新增的 Symbol 类型。凡是属性名属于 Symbol 类型,就都是独一无二的,可以保证不会与其他属性名产生冲突。

let name = Symbol();typeof name
// "symbol"

变量name就是一个独一无二的值。typeof运算符的结果,表明变量name是 Symbol 数据类型,而不是字符串之类的其他类型。 所以不会出现重名的可能。

Symbol :它是一种类似于字符串的数据类型。

let s1 = Symbol('foo');
let s2 = Symbol('bar');s1 // Symbol(foo)
s2 // Symbol(bar)s1.toString() // "Symbol(foo)"
s2.toString() // "Symbol(bar)"

s1s2是两个 Symbol 值。如果不加参数,它们在控制台的输出都是Symbol(),不利于区分。有了参数以后,就等于为它们加上了描述,输出的时候就能够分清,到底是哪一个值。

如果 Symbol 的参数是一个对象,就会调用该对象的toString()方法,将其转为字符串,然后才生成一个 Symbol 值。

2、作为属性名的 Symbol

由于每一个 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!"

上面代码通过方括号结构和Object.defineProperty()方法,将对象的属性名指定为一个 Symbol 值。

注意,Symbol 值作为对象属性名时,不能用点运算符

const mySymbol = Symbol();
const a = {};a.mySymbol = 'Hello!';
a[mySymbol] // undefined
a['mySymbol'] // "Hello!"

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

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

相关文章

CentOS7使用Docker搭建Joplin Server并实现多端同步与公网使用本地笔记

文章目录 1. 安装Docker2. 自建Joplin服务器3. 搭建Joplin Sever4. 安装cpolar内网穿透5. 创建远程连接的固定公网地址 Joplin 是一个开源的笔记工具,拥有 Windows/macOS/Linux/iOS/Android/Terminal 版本的客户端。多端同步功能是笔记工具最重要的功能,…

基于springboot实现常州地方旅游管理系统项目【项目源码+论文说明】

基于springboot实现旅游管理系统演示 摘要 随着旅游业的迅速发展,传统的旅游信息查询方式,已经无法满足用户需求,因此,结合计算机技术的优势和普及,针对常州旅游,特开发了本基于Bootstrap的常州地方旅游管…

内存卡乱码?别担心,这里有你的数据恢复秘籍!

一、乱码困扰:内存卡数据成迷团 在数字化时代,内存卡作为我们存储数据的重要工具,承载着大量的照片、视频、文档等重要信息。然而,当有一天我们插上内存卡,发现原本井井有条的文件变成了乱码,那种焦虑和无…

5.Godot节点和功能及Node节点属性分析

1. 节点和功能的关系 节点 Node ,用于实现一种功能,例如,Sprite 节点,用于图片的显示一个节点的功能取决于它挂载了哪些子节点,它包含了哪些功能的子节点,就包含了对应子节点表示的功能节点是可选的&#…

在个人电脑上,本地部署llama2-7b大模型

文章目录 前言原理效果实现 前言 我想也许很多人都想有一个本地的ai大语言模型,当然如果能够摆脱比如openai,goole,baidu设定的语言规则,可以打破交流界限,自由交谈隐私之类的,突破规则,同时因为部署在本地也不担心被其他人知道,那最好不过了 那究竟有没有这样的模型呢? llam…

怎么修改图片大小?在线图片处理的方法介绍

在日常生活中,我们经常需要调整图片大小以适应不同的网络上传要求。不管是微信、QQ换头像背景图片,还是各种社交媒体相册,都需要对图片改大小,今天就介绍几个关于修改图片大小的方法,可以不用下载安装就能在线图片处理…

WIFI详解及周边拓展

一、WiFi协议简介 WiFi协议,也称为无线保真技术,是一种允许电子设备通过无线方式在局域网(WLAN)和互联网上进行通信的技术标准。WiFi协议是基于IEEE 802标准的子系列标准协议,由电气和电子工程师协会制定。随着移动设备…

准备全方面加速企业申办乙级风力发电-材料准备

为了全方面加速企业申办乙级风力发电资质的材料准备过程,可以遵循以下步骤和建议: 深入了解资质标准: 仔细研读最新的乙级风力发电资质标准文件,明确所需满足的各项条件,包括注册资本、人员配置、技术装备、工程业绩、…

Docker篇(一)— Docker介绍

目录 什么是Docker应用部署的环境问题Docker解决依赖兼容问题Docker解决操作系统环境差异 小结 什么是Docker 微服务虽然具备各种各样的优势,但服务的拆分通用给部署带来了很大的麻烦。 分布式系统中,依赖的组件非常多,不同组件之间部署时往…

node.js 常用命令大全

在Node.js中,有一些常用的命令和工具,这些命令和工具可以帮助你在开发过程中进行代码管理、调试、依赖管理等操作。以下是一些常用的Node.js命令和工具: npm:Node.js的包管理工具,用于安装、卸载、更新和管理Node.js模…

没找到问题原因,再怎么debug也是白费

事情的经过 事情的经过是这样的:每天早上我都需要在开机后通过网页向某个服务器请求最新的信息,并基于返回的信息,继续后续的动作。但之前获取信息的过程全部是手动的,非常的麻烦。 自动化尝试 之前我一直想尝试写一个脚本&…

Java多线程的线程状态和线程池参数

一、线程状态 当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。线程对象在不同的时期有不同的状态。Java中的线程状态被定义在了java.lang.Thread.State枚举类中,State枚举类的源码如下: publi…

计算机网络——应用层(2)FTP,DNS

一、FTP:文件传输协议 将文件传输到远程主机或从远程主机传输文件。C/S模式。server是远程主机。 1、控制连接与数据连接分开 客户端服务器通过端口21联系,使用TCP传输协议客户端通过控制连接获得身份确认客户端通过控制连接发送命令浏览远程目录收到…

ZL-099动物行为学视频分析系统

简单介绍: 动物行为学视频分析系统是一套通过视频摄像机和计算机,采用图像处理技术,自动跟踪和记录动物活动的通用型运动轨迹记录分析系统,可以应用在神经药理,学习记忆药理,药理和新药神经系统一般药理毒理…

STM32SPI通信外设并读写W25Q64

文章目录 前言介绍SPI外设SPI框图简化框图 时序主模式全双工连续传输非连续传输 软硬件波形对比硬件SPI读写W25Q64接线图代码规划代码实现 前言 本文介绍STM32中自带的SPI外设,在大容量产品和互联型产品上,SPI接口可以配置为支持SPI协议或者支持I2S音频…

前端实现自动获取农历日期:探索JavaScript的跨文化编程

🌟 前言 欢迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍 &#x…

Verilog语法——按位取反“~“和位宽扩展的优先级

前言 先说结论,如下图所示,在Verilog中“~ ”按位取反的优先级是最高的,但是在等式计算时,有时候会遇到位宽扩展,此时需要注意的是位宽扩展的优先级高于“~”。 验证 仿真代码,下面代码验证的是“~”按位取…

【canvas】canvas基础使用(七):绘制图像

简言 学习canvas如何绘制图片或视频。 绘制图像 给定一个图像,一般使用drawImage()方法绘制。 drawImage 绘制图像 Canvas 2D API 中的 CanvasRenderingContext2D.drawImage() 方法提供了多种在画布(Canvas)上绘制图像的方式。 语法&…

python连接mysql步骤

要在 Python 中连接 MySQL 数据库,你需要遵循以下步骤: 步骤 1: 安装 MySQL Connector/Python 首先,确保你的系统中已安装了 MySQL Connector/Python,这是 MySQL 官方提供的用于在 Python 中连接 MySQL 的驱动程序。你可以通过 …

为什么内存要对齐

1.硬件要求: 许多处理器和硬件架构对于特定数据类型的访问要求内存地址是对齐的。例如,某些处理器可能要求访问4字节整数的地址必须是4的倍数,否则可能会导致性能下降甚至错误。因为可能会导致额外的处理器周期用于处理未对齐的访问&#xff…