symbol 类型学习

探索 JavaScript 中的独特标识符:Symbol 类型

JavaScript 作为一门灵活且功能丰富的编程语言,提供了多种数据类型供开发者构建复杂的应用程序。其中,一种相对新颖且独特的类型——Symbol,为对象属性的管理带来了更高的安全性和定制性。本文将深入剖析Symbol类型的概念、特性及其在实际开发中的应用场景。

什么是 Symbol 类型?

Symbol是一种基本数据类型,代表了不可变且唯一的标识符。它不同于常见的字符串、数字等类型,旨在提供一种机制,使得开发者能够在对象中创建不易被外界干扰或误操作的属性。创建Symbol值通常通过调用Symbol()函数实现,可以传递一个可选的描述字符串,以便在调试过程中提供识别信息:

const uniqueID = Symbol("unique identifier");

此处创建的uniqueID是一个独一无二的Symbol值,即使有多个Symbol拥有相同的描述字符串,它们彼此之间仍然是互不相同的:

const anotherUniqueID = Symbol("unique identifier");
console.log(uniqueID === anotherUniqueID); // 输出:false

Symbol 的特性与行为

不会自动转换为字符串

与其他大多数 JavaScript 值不同,Symbol不会进行隐式类型转换。尝试将Symbol直接传入alert或其他期望字符串的函数,会导致类型错误。若需显示Symbol值,应显式调用.toString()方法或访问其.description属性:

const sym = Symbol("description");
console.log(sym.toString()); // 输出:Symbol(description)
console.log(sym.description); // 输出:description
“隐藏”对象属性

Symbol最显著的应用之一在于创建对象的“私有”或“隐藏”属性。由于Symbol作为对象键时不会出现在for...in循环、Object.keys()结果中,也不受Object.assign()的影响,它们能有效地避免外部代码的无意访问和修改:

const secretKey = Symbol("secret");
const user = {name: "Alice",[secretKey]: "top-secret-info"
};for (const prop in user) {console.log(prop); // 只输出:name
}console.log(Object.keys(user)); // 输出:[ 'name' ]const newUser = Object.assign({}, user);
console.log(newUser[secretKey]); // 输出:undefined,secretKey 属性未被复制

全局 Symbol 与注册表

虽然通常情况下每个Symbol都是唯一的,但在某些场景下,我们可能需要不同代码模块共享同一个Symbol。为此,JavaScript 提供了全局Symbol注册表。通过Symbol.for(key)方法,可以查询或创建一个具有特定名称(key)的全局Symbol,确保多次调用时返回同一实体:

const globalID = Symbol.for("globalID");
const sameGlobalID = Symbol.for("globalID");
console.log(globalID === sameGlobalID); // 输出:true

对应地,Symbol.keyFor(sym)方法可以用于从全局Symbol获取其关联的名称(仅限于全局Symbol):

const sym = Symbol.for("shared");
console.log(Symbol.keyFor(sym)); // 输出:"shared"

系统 Symbol 与内建行为

JavaScript 内部定义了一系列被称为“系统”或“众所周知”的Symbol,这些特殊Symbol常用于控制对象的特定行为,如迭代器(Symbol.iterator)、原始值转换(Symbol.toPrimitive)等。通过在对象上定义这些系统Symbol对应的属性,开发者能够调整对象与内置操作的交互方式,增强代码的灵活性和可定制性。

总结

Symbol类型作为 JavaScript 中的唯一标识符,为开发者提供了以下关键优势:

  1. 唯一性:每个Symbol值都是独立且不可重复的,确保了其作为对象属性键时的唯一标识作用。
  2. 安全性Symbol属性不易被外部代码访问或修改,有助于实现对象内部状态的封装与保护。
  3. 全局共享:通过全局Symbol注册表,可以在多个代码模块间共享同一Symbol标识符,实现跨模块的协调与通信。
  4. 内建行为控制:系统Symbol允许开发者精细调整对象与JavaScript内置操作的交互,实现更复杂的对象行为。

尽管Symbol并非绝对不可见(可通过Object.getOwnPropertySymbolsReflect.ownKeys方法获取),但在日常开发中,它们为对象属性的管理和保护提供了有力工具,有助于构建更加健壮、可维护的代码。

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

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

相关文章

你的mongodb客户端是哪个呢?

MongoDB 是一种流行的文档数据库,它可以支持多种场景和应用。有很多客户端工具可以用来管理和操作 MongoDB,以下是一些常用的工具,以及它们的介绍: 一、MongoDB Shell MongoDB Shell 是连接(和使用)MongoD…

追溯历史:SIEM 中的生成式人工智能革命

作者:来自 Elastic Mike Nichols, Mike Paquette 网络安全领域仿佛是现实世界的一个映射,安全运营中心(security operation center - SOC)就像是你的数字警察局。网络安全分析师就像是警察,他们的工作是阻止网络犯罪分…

hyref 开发者推荐项目

GitHub - limingxinleo/phalcon: phalcon项目结构 GitHub - fan3750060/wpcore: php , swoole, wow, wowcore, World of Warcraft,master> wow_3.3.5a(Can not work normally) ,branch>wow_2.4.3_8606

基于SpringWeb MultipartFile文件上传、下载功能

在Web开发中,文件上传是一个常见的功能需求。Spring框架提供了MultipartFile接口,用于处理文件上传请求。MultipartFile可以代表一个多部分文件上传请求中的一个文件,提供了一系列方法用于获取文件的各种属性和内容,使得在后端处理…

数据中台规划与建设方案PPT(建议收藏)

推荐书籍: 《分布式商业生态战略:数字商业新逻辑与企业数字化转型新策略》 书籍介绍: 本书从新时代商业环境出发,紧随市场热点,如元宇宙、Web 3.0、资产数字化、反垄断、要素市场化配置、分布式自治组织(d…

2024年4月13日美团春招实习试题【第二题:最多0的个数】-题目+题解+在线评测【贪心】

2024年4月13日美团春招实习试题【第二题:最多0的个数】-题目题解在线评测【贪心】 题目描述:输入描述输出描述样例 解题思路一:贪心,将所有负数变为正数,然后排序。nums.sort(key lambda x: abs(x))解题思路二:c解题思…

数据仓库作业五:第8章 关联规则挖掘

目录 第8章 关联规则挖掘作业题 第8章 关联规则挖掘 作业题 1、设4-项集 X { a , b , c , d } X\{a,b,c,d\} X{a,b,c,d},试求出由 X X X 导出的所有关联规则。 解: 首先生成项集的所有非空真子集。这包括: { a } , { b } , { c } , {…

UE5集成gRPC

最近有项目需要在UE5里做RPC,对比了thrift、gRPC、rcplib等开源rpc框架,由于习惯使用protobuf,故选择了gRPC。然而,Google出品也是一言难尽啊,最起码编译太繁琐了。 本次使用的gRPC版本为1.62.1,UE5.2&…

基于机器学习的车辆状态异常检测

基于马氏距离的车辆状态异常检测(单一传感器) 基于多元自动编码器的车辆状态异常检测 基于单传感器平滑马氏距离的车辆状态异常检测 工学博士,担任《Mechanical System and Signal Processing》等期刊审稿专家,擅长领域&#xff1…

数据结构详解

数据结构 线性结构 一个有序数据元素的集合其中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的 非线性结构 线性结构的对立面 数组 定义 数组是一种线性数据结构,用于存储相同类型…

java面向对象的封装Triangle

(1)定义三角形类Triangle, * - 声明实例变量a,b,c,代表三角形三条边,全部私有化private, * - 提供每条边的get方法, * - 提供public void setBases(double a, double b, double c):要…

【Redis(3)】深入理解Redis三种高可用方案,以做出明智的选择

通过上一篇文章详细介绍了Redis的持久化方式RDB和AOF配置,这一篇主要介绍Redis的几种高可用方案。 Redis作为一个成熟的远程字典服务,提供了三种常用的高可用设计方案,Redis的每种高可用性方案都各有千秋,选择时需要细致考虑业务…

JavaSE基础:数值比较

数值比较 目录 数值比较 等值判断 和 的区别 重写 equals 方法 数值比较 compareTo 方法 compare 方法 等值判断 Object 类实现了 equals 方法 ,用于比较两个数据元素是否相等。 浮点类型由于精度丢失问题,进行等值判断常出现错误。如果有需求推…

【加密周报】中东“惊雷”炸响币圈!比特币减半成功完成,市场情绪已被提前消化!中美突传USDT重磅消息!

周五(4月19日),比特币经历惊魂一刻,伊朗核设施所处的中部城市伊斯法罕惊传爆炸,叙利亚与伊拉克也都传来爆炸声响,中东全面战争与核武攻击威胁触发加密市场恐慌情绪。比特币一度下探59600美元。但随后伊朗强调核设施未受损&#xf…

组件安全(Solr、Shiro、Log4j、Jackson、FastJson、XStream)

Solr 主要基于HTTP和 Apache Lucene 实现的全文搜索服务器。 特征&#xff1a;图标识别 端口&#xff1a;8393 CVE-2019-0193&#xff08;远程命令执行漏洞&#xff09; 漏洞版本&#xff1a;Apache Solr < 8.2.0 利用条件&#xff1a; Apache Solr 的 DataImportHandler 启…

数据结构_带头双向循环链表

List.h 相较于之前的顺序表和单向链表&#xff0c;双向链表的逻辑结构稍微复杂一些&#xff0c;但是在实现各种接口的时候是很简单的。因为不用找尾&#xff0c;写起来会舒服一点。&#xff08;也可能是因为最近一直在写这个的原因&#xff09; #pragma once #include<std…

二维码门楼牌管理应用平台建设:构建智能社区治理新模式

文章目录 前言一、二维码门楼牌管理应用平台的意义二、走访日志功能的重要性三、走访日志功能的具体应用四、走访日志功能的优势五、结语 前言 在数字化浪潮下&#xff0c;社区管理正面临着前所未有的机遇与挑战。二维码门楼牌管理应用平台的建设&#xff0c;不仅为社区治理提…

代码随想录训练营Day 27|Python|Leetcode|122.买卖股票的最佳时机II ● 55. 跳跃游戏 ● 45.跳跃游戏II

122.买卖股票的最佳时机II 给你一个整数数组 prices &#xff0c;其中 prices[i] 表示某支股票第 i 天的价格。 在每一天&#xff0c;你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买&#xff0c;然后在 同一天 出售。 返回 你能获…

fastjson转换json时默认将属性第一个字母转小写

描述&#xff1a; 我新建了一个实体类&#xff0c;但是实体类的首字母是大写的&#xff0c;但是使用fastjson后打印的&#xff0c;Json字符串首字母却是小写的&#xff0c;这是fastjson的一个bug 实体类&#xff1a; Json字符串&#xff1a; 解决方法&#xff1a; 一、使…

HoloLens2的Unity应用在电脑上发布成安装包,然后通过wifi安装到设备

一、VS工程中的鼠标右键 二、发布——>创建应用程序包 三、选择【旁加载】 四、选择签名方法&#xff1a; 五、选择和配置包 六、创建完毕 七、网络连接设备 八、登录设备 九、安装app