什么是Symbol?

news/2025/10/10 14:31:50/文章来源:https://www.cnblogs.com/lovebing/p/19133002

什么是Symbol?


** 例子 1:对象“私有属性”隔离(防止外部乱改)**

场景:我们写一个用户模型类 User,需要标记“是否已登录”这个状态,但不想让外部直接改。

// user.js
const _isLogged = Symbol('isLogged');export class User {constructor(name) {this.name = name;this[_isLogged] = false;}login() {this[_isLogged] = true;}isLogged() {return this[_isLogged];}
}

外部使用:

import { User } from './user.js';const u = new User('Tom');
u.login();console.log(u.isLogged()); // trueconsole.log(Object.keys(u)); // ['name'] 看不到 isLogged 状态
u._isLogged = false; // 无效,外部改不了 Symbol 的那个字段

解释:

_isLogged 是一个 Symbol,别人看不见,也拿不到引用。

这样你就能“保护”这个属性,相当于实现了“私有字段”。


⚙️ 例子 2:防止框架/插件字段冲突(在库开发中常见)

场景:假设你写了一个数据追踪库 tracker.js,要在对象里偷偷存一些标记信息。

但怕用户对象里也有同名字段,比如 id、__meta 等。

// tracker.js
const TRACKER_ID = Symbol('trackerId');export function markTracked(obj) {obj[TRACKER_ID] = Date.now();
}export function isTracked(obj) {return !!obj[TRACKER_ID];
}

外部代码:

import { markTracked, isTracked } from './tracker.js';const user = { id: 1, name: 'Tom' };
markTracked(user);console.log(user); 
// { id: 1, name: 'Tom' }  // 看不出来被标记了console.log(isTracked(user)); // true

意义:

你的库可以安全地在任意对象上打“隐形标记”,

不怕和用户自己的字段重名。


** 例子 3:自定义对象行为(框架内部常用)**

场景:实现一个类,控制它在被转字符串或比较时的表现。

const ID = Symbol('id');class Product {constructor(name, id) {this.name = name;this[ID] = id;}[Symbol.toPrimitive](hint) {if (hint === 'string') return this.name;if (hint === 'number') return this[ID];return this.name;}
}const p = new Product('iPhone', 1001);console.log(`${p}`); // 'iPhone'
console.log(+p);     // 1001

在一些框架中(比如 ORM / 数据模型),会用这种方式:

  • 让对象在日志打印时显示友好的字符串;
  • 但在计算或比较时,自动转成 ID 或主键值。

** Bonus:与** Symbol.for() 结合,用全局共享标识

场景:多个模块都需要共享一个“全局唯一标识”,比如 Redux 中的 action type。

// moduleA.js
export const ACTION_TYPE = Symbol.for('APP_ACTION');// moduleB.js
import { ACTION_TYPE } from './moduleA.js';const action = { type: ACTION_TYPE, payload: 'data' };// 任意地方只要用 Symbol.for('APP_ACTION') 拿到的就是同一个标识
console.log(Symbol.for('APP_ACTION') === ACTION_TYPE); // true

✅ 总结(贴近实战的用途)

用途 实际场景
1️⃣ 隐藏内部属性 模拟私有字段(框架、SDK 中常见)
2️⃣ 防止命名冲突 在第三方库或插件中安全打标
3️⃣ 自定义对象行为 控制 toString()、+、== 的表现
4️⃣ 跨模块唯一标识 用 Symbol.for() 实现全局共享常量

Don’t reinvent the wheel, library code is there to help.

欢迎关注公-众-号【TaonyDaily】、留言、评论,一起学习。

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

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

相关文章

苹果应用上架全流程指南 iOS 应用发布步骤、App Store 审核流程、ipa 文件上传与 uni-app 打包实战经验 - 教程

苹果应用上架全流程指南 iOS 应用发布步骤、App Store 审核流程、ipa 文件上传与 uni-app 打包实战经验 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; disp…

2025 年门窗厂家推荐排行榜,新标门窗从型材到成品实现全链新标造铝合金门窗 / 系统门窗推荐这十家公司

在当前的门窗行业中,消费者面临着诸多选择难题。一方面,市场上门窗产品质量参差不齐,部分厂家为降低成本,使用劣质型材和玻璃,导致门窗抗压、抗风压性能不足,使用一段时间后易出现变形、漏风漏水等问题,不仅影响…

PyCharm 2025.1重磅升级:AI驱动开发+全功能免费核心,Python开发者必看

作为Python开发者的首选IDE,JetBrains推出的PyCharm 2025.1带来了颠覆性更新。此次版本采用统一架构,首次将专业版与社区版功能深度整合,不仅让核心开发工具免费开放,更以AI驱动的全流程开发体验重新定义了Python编…

create dir or file in Qpython

Create dir or file in Qpython Import qpy Import osCreate d or f in cashos.mkdir(qpy.tmp+dir1) open(qpy.tmp+/dir1/file1.py,w)create d or f on the container directory,and will create file1 on secon…

Oracle案例:SOLARIS RAC平台模拟节点crash后强制删除与增加

我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢! 由于博客中有大量代码,通过页面浏览效果更佳。Oracle案例:…

CAD文件处理控件Aspose.CAD教程:在 Python 中将 SVG 转换为 PDF

在本文中,我们将使用 Python 以编程方式将 SVG 转换为 PDF。我们将通过 .NET 使用 Aspose.CAD for Python,这款 CAD SDK 功能强大,足以顺利完成 SVG 到 PDF 的转换,我们将通过编写代码示例来演示其功能。如果您处理…

电子打气泵方案(工作原理和组成以及功能参数)

打气泵是一种常见的气体压缩设备,它可以将空气或其他气体压缩成高压气体,用于充气、输送、压缩等工业和生活领域。打气泵的原理是利用机械或电动力量将气体压缩,使其体积减小,压力增大,从而达到充气的目的。下面将…

2025 年电源滤波器源头厂家最新推荐排行榜:精选优质国内品牌,覆盖单相 / 三相 / 直流等多类型产品直流/IEC插座式/定制化电源滤波器厂家推荐

随着工业自动化、医疗设备、新能源等领域的高速发展,电源滤波器作为保障设备稳定运行、降低电磁干扰的核心部件,市场需求日益旺盛。但当前市场上源头厂家数量繁杂,部分厂家存在技术实力不足、产品质量不稳定、售后服…

(六)重构的艺术:简化困难条件逻辑的秘诀

(六)重构的艺术:简化困难条件逻辑的秘诀pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "…

2025 年压力表厂家最新推荐排行榜重磅发布!聚焦耐腐蚀耐震性能,助力企业精准选优质产品数显/耐高温/数字/抗震/膜盒/隔膜压力表厂家推荐

在工业生产中,压力表是保障流程安全、稳定与精准的关键仪器,化工、石化、冶金、医药等行业对其需求日益多元,却也面临诸多痛点。部分产品遇强腐蚀性介质易损坏、测量不准,振动环境下指针抖动、读值不稳,且不少品牌…

故障诊断:奇怪的ORA-01000故障处理

我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢! 由于博客中有大量代码,通过页面浏览效果更佳。来自一位兄弟…

详细介绍:【数据分享】《中国农村统计年鉴》(1985-2024年)全pdf和excel

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025 年全屋定制厂家最新推荐排行榜:聚焦 ENF 级环保与优质服务力,权威甄选品牌助消费者精准选择

当下全屋定制行业飞速发展,市场品牌繁杂且质量参差不齐,消费者在选择时常常陷入困境。部分品牌忽视环保标准,产品甲醛超标威胁健康;有些品牌服务体系不完善,从设计到售后问题频发;还有品牌设计能力不足,难以满足…

2025 年绿色板材源头厂家最新推荐排行榜:聚焦 FSC 与 EPA 认证,深度测评环保板材领军品牌生态/环保/装修板材厂家推荐

在 “双碳” 战略深化与消费品质升级的双重驱动下,板材行业正加速向绿色化、智能化转型,而板材作为家居与工程装饰的核心材料,其环保性与品质直接关乎人居健康与项目质量。当前市场中厂家良莠不齐,部分产品存在有害…

大三上 需求与商业模式创新 作业1的设想:如何评价

关于“如何评价”APP的项目构想与可行性探讨 尊敬的匡老师: 您好! 我是您的学生陆舟landboat。在课程的学习过程中,我深受当前互联网文化现象的启发,构思了一款名为“如何评价”的移动应用(APP)创意。现将此构想…

C/C++逆向分析实战:变量存储与安全防护全攻略

在软件开发的世界里,C/C++语言因其卓越的性能和强大的功能而备受开发者青睐。然而,随着技术的不断进步,逆向工程也逐渐成为一种常见的攻击手段。今天,我们将深入探讨C/C++中不同类型的变量在逆向分析中的表现,并分…

2025 最新超声波清洗机厂家推荐排行榜:工业 / 精密 / 实验室多场景适配厂商权威解析数控/通过式/多功能/实验室超声波清洗机厂家推荐

在工业制造精密化、医疗检测严苛化、科研实验精细化的趋势下,超声波清洗机已成为跨领域生产的核心设备,其性能直接决定产品合格率与实验准确性。但当前市场乱象显著:部分厂商技术滞后,设备无法达到半导体行业微米级…

(8)ASP.NET Core2.2 中的MVC路由一 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

LED无线打气泵方案芯片(CSU18P88)

无线打气泵是一种常见的气体压缩设备,它可以将空气或其他气体压缩成高压气体,用于充气、输送、压缩等工业和生活领域。打气泵的原理是利用机械或电动力量将气体压缩,使其体积减小,压力增大,从而达到充气的目的。无…