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 】
相关推荐:
Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势
ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集
HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】
大同网页,大同瑞慈医院官网?
中山网站推广排名,中山信息港登录入口?
html如何与html链接_实现多个HTML页面互相链接【互相】
免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?
如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?
Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】
微信小程序 scroll-view组件实现列表页实例代码
Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲
南京网站制作费用,南京远驱官方网站?
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】
在线制作视频网站免费,都有哪些好的动漫网站?
Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复
jQuery中的100个技巧汇总
教你用AI润色文章,让你的文字表达更专业
如何在阿里云服务器自主搭建网站?
如何快速搭建自助建站会员专属系统?
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
Laravel如何处理异常和错误?(Handler示例)
非常酷的网站设计制作软件,酷培ai教育官方网站?
Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程
Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
如何快速建站并高效导出源代码?
Python文件异常处理策略_健壮性说明【指导】
HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】
如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】
VIVO手机上del键无效OnKeyListener不响应的原因及解决方法
jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】
香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南
iOS中将个别页面强制横屏其他页面竖屏
装修招标网站设计制作流程,装修招标流程?
Python图片处理进阶教程_Pillow滤镜与图像增强
js代码实现下拉菜单【推荐】
如何用狗爹虚拟主机快速搭建网站?
Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置
谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程
Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程
Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中
SQL查询语句优化的实用方法总结
Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】
怎么用AI帮你设计一套个性化的手机App图标?
黑客如何利用漏洞与弱口令入侵网站服务器?
在线教育网站制作平台,山西立德教育官网?
Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程
Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】
Laravel如何使用Eloquent进行子查询


he')