Javascript的Symbol类型有何用途_如何用Javascript Symbol创建唯一键?
发布时间 - 2025-12-31 00:00:00 点击率:次Symbol是JavaScript中唯一且不可变的原始值,核心用途是创建不与其他键冲突的对象属性名;每次Symbol()调用返回全新值,需用方括号访问,不参与常规枚举;Symbol.for()支持跨上下文共享,Symbol.toStringTag等内置Symbol用于定制对象行为协议。
Symbol 是 JavaScript 中唯一且不可变的原始值
它最核心的用途是创建不会与其他任何键冲突的对象属性名,尤其适合库作者或框架开发者避免命名污染。普通字符串键哪怕再长、再随机,理论上都可能撞车;而 Symbol() 每次调用都返回一个全新、不相等的值,连 === 都不成立。
用 Symbol 创建唯一对象键的正确方式
直接把 Symbol() 赋给对象属性即可,但要注意:它不会出现在 for...in、Object.keys() 或 JSON.stringify() 中,属于“隐藏但可访问”的键。
- 必须用方括号语法
obj[mySym]访问,不能用点号obj.mySym - 若需调试时看到 Symbol 键,可用
Object.getOwnPropertySymbols(obj)提取 - 重复调用
Symbol()得到的是不同值,即使描述相同:Symbol('a') !== Symbol('a')
const sym1 = Symbol('id');
const sym2 = Symbol('id');
console.log(sym1 === sym2); // false
const user = {
name: 'Alice',
[sym1]: 1001
};
console.log(user[sym1]); // 1001
console.log(Object.keys(user)); // ['name']
console.log(Object.getOwnPropertySymbols(user)); // [Symbol(id)]
Symbol.for() 和 Symbol.keyFor():跨执行上下文共享 Symbol
普通 Symbol() 全局唯一,但每次调用都新造一个;如果需要多个模块都能拿到同一个 Symbol(比如统一定义一个 “metadata” 键),就得用 Symbol.for(key) —— 它会先查全局注册表,有就返回,没有才新建。
-
Symbol.for('debug')和另一处同名调用返回的是同一个 Symbol -
Symbol.keyFor(sym)只对Symbol.for()创建的 Symbol 有效,对普通Symbol()返回undefined - 注意命名空间污染风险:全局注册表是共享的,建议加前缀如
Symbol.for('mylib:cac
he')
const s1 = Symbol.for('state');
const s2 = Symbol.for('state');
console.log(s1 === s2); // true
console.log(Symbol.keyFor(s1)); // 'state'
console.log(Symbol.keyFor(Symbol('state'))); // undefined
Symbol.toStringTag 和其他内置 Symbol 的实际作用
这些是 JavaScript 引擎预留的“钩子”,用于定制对象在类型检测或字符串化时的行为。比如 Symbol.toStringTag 控制 Object.prototype.toString.call(obj) 的输出,常被用来伪装类名或兼容旧代码。
立即学习“Java免费学习笔记(深入)”;
-
Symbol.iterator让对象可被for...of遍历,必须返回一个迭代器对象 -
Symbol.hasInstance自定义instanceof判断逻辑 - 它们不是“键名工具”,而是行为协议,误当普通 Symbol 用会导致功能失效
class MyList {
constructor(items) {
this.items = items;
}
get [Symbol.toStringTag]() {
return 'MyList';
}
}
console.log(Object.prototype.toString.call(new MyList([1,2]))); // '[object MyList]'
Symbol 的真正难点不在创建,而在“何时不该用”——比如想让某个键能被序列化或遍历时暴露,就别用 Symbol;想让多个模块协同操作同一键,就得选 Symbol.for() 而非裸调 Symbol()。
# javascript
# java
# js
# json
# 工具
# 注册表
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
在线制作视频网站免费,都有哪些好的动漫网站?
如何在阿里云通过域名搭建网站?
如何在Windows环境下新建FTP站点并设置权限?
专业商城网站制作公司有哪些,pi商城官网是哪个?
Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册
Laravel如何配置和使用缓存?(Redis代码示例)
怎么用AI帮你为初创公司进行市场定位分析?
软银砸40亿美元收购DigitalBridge 强化AI资料中心布局
Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
如何在IIS中配置站点IP、端口及主机头?
iOS中将个别页面强制横屏其他页面竖屏
如何有效防御Web建站篡改攻击?
大学网站设计制作软件有哪些,如何将网站制作成自己app?
Laravel用户密码怎么加密_Laravel Hash门面使用教程
HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】
宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法
如何快速查询网站的真实建站时间?
微信小程序制作网站有哪些,微信小程序需要做网站吗?
🚀拖拽式CMS建站能否实现高效与个性化并存?
JS中页面与页面之间超链接跳转中文乱码问题的解决办法
SQL查询语句优化的实用方法总结
在线教育网站制作平台,山西立德教育官网?
Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】
如何用狗爹虚拟主机快速搭建网站?
如何快速上传自定义模板至建站之星?
千库网官网入口推荐 千库网设计创意平台入口
如何快速生成橙子建站落地页链接?
如何快速重置建站主机并恢复默认配置?
Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
如何在香港服务器上快速搭建免备案网站?
中山网站制作网页,中山新生登记系统登记流程?
如何用PHP快速搭建高效网站?分步指南
如何在服务器上三步完成建站并提升流量?
再谈Python中的字符串与字符编码(推荐)
想要更高端的建设网站,这些原则一定要坚持!
使用C语言编写圣诞表白程序
如何挑选最适合建站的高性能VPS主机?
如何快速生成ASP一键建站模板并优化安全性?
Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】
免费网站制作appp,免费制作app哪个平台好?
百度浏览器ai对话怎么关 百度浏览器ai聊天窗口隐藏
香港服务器网站卡顿?如何解决网络延迟与负载问题?
Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】
jQuery validate插件功能与用法详解
如何自定义建站之星模板颜色并下载新样式?
网站建设整体流程解析,建站其实很容易!
浅谈redis在项目中的应用
Laravel如何实现API版本控制_Laravel版本化API设计方案


he')