当前位置: 首页 > news >正文

Symbol简单介绍

JavaScript Symbol

JavaScript Symbol是一种原始数据类型,用于创建唯一的标识符。它们是 ES6 引入的新类型,用于表示唯一的值,可以用作对象的属性名或方法名。

创建 Symbol

Symbol 可以使用 Symbol() 函数创建,且每次调用都会返回一个新的唯一符号。可以传递一个可选的描述字符串作为参数,用于调试目的。

const mySymbol = Symbol('mySymbol');
console.log(mySymbol); // 输出:Symbol(mySymbol)

Symbol 的特性

  • 唯一性:每个 Symbol 都是唯一的,即使使用相同的描述字符串创建,也会得到不同的 Symbol
  • 不可变性:Symbol一旦创建就不能被改变或修改
  • 不可转换性:Symbol不能被转换为其他类型,如字符串或数字

Symbol 的用途

  • 私有属性和方法:Symbol可以用来创建私有属性和方法,防止外部访问

 

class MyClass {#privateSymbol = Symbol('private');constructor() {this[#privateSymbol] = 'Private value';}#privateMethod() {console.log('Private method called');}publicMethod() {console.log(this[#privateSymbol]);this.#privateMethod();}
}const obj = new MyClass();
obj.publicMethod(); // 输出:Private value,Private method called// 尝试访问私有属性和方法
console.log(obj[#privateSymbol]); // 报错:ReferenceError: #privateSymbol is not defined
obj.#privateMethod(); // 报错:SyntaxError: Private field '#privateMethod' must be declared in an enclosing class

在上面的例子中,我们使用 #privateSymbol 创建了一个私有属性和一个私有方法 #privateMethod。我们可以在类的内部访问这些私有成员,但在类的外部则无法访问。注意:在 JavaScript 中,使用 # 符号来声明私有属性和方法是 ECMAScript 2022 中引入的新特性。 

  • 缓存键:Symbol可以用作缓存键,存储和检索值
const cache = new Map();function getCacheValue(key) {if (cache.has(key)) {return cache.get(key);} else {const value = computeValue(key); // 假设 computeValue 是一个计算值的函数cache.set(key, value);return value;}
}const symbolKey = Symbol('myKey');
const value = getCacheValue(symbolKey);
console.log(value); // 输出:计算出的值

在上面的例子中,我们使用一个 Map 对象作为缓存,Symbols 作为缓存键。由于 Symbols 是唯一的,我们可以确保缓存键是唯一的,从而避免缓存冲突。  

  • 事件名称:Symbol可以用作事件名称,创建唯一的事件.
const eventBus = new EventEmitter();const EVENT_NAME = Symbol('myEvent');eventBus.on(EVENT_NAME, () => {console.log('事件被触发');
});eventBus.emit(EVENT_NAME); // 输出:事件被触发

在上面的例子中,我们使用一个 EventEmitter 对象作为事件总线,Symbols 作为事件名称。由于 Symbols 是唯一的,我们可以确保事件名称是唯一的,从而避免事件冲突。 

  • 枚举:Symbol可以用来定义枚举,提供语义化的名称和唯一值
const COLOR = {RED: Symbol('red'),GREEN: Symbol('green'),BLUE: Symbol('blue')
};console.log(COLOR.RED); // 输出:Symbol(red)
console.log(COLOR.GREEN); // 输出:Symbol(green)
console.log(COLOR.BLUE); // 输出:Symbol(blue)

实际应用

react element中的$$typeof

$$typeof 的值是一个 Symbol,具体来说是 Symbol.for('react.element')。这个 Symbol 是全局唯一的,用于标识 React 元素。

使用 Symbol 作为 $$typeof 的值有以下几个原因:

  • 安全性:Symbols 不能被包含在 JSON 中,这意味着即使服务器有安全漏洞并返回 JSON 而不是文本,JSON 也不能包含 Symbol.for('react.element'),从而防止恶意数据被处理为 React 元素。
  • 全局唯一性:Symbols 是全局唯一的,这意味着即使在不同的环境中(如 iframe 或 worker),Symbol.for('react.element') 也会返回相同的值。
     


http://www.mrgr.cn/news/54061.html

相关文章:

  • DML语言
  • 《中国结算全国股份转让系统—结算参与人数据接口规范》
  • Vue脚手架学习 vue脚手架配置代理、插槽、Vuex使用、路由、ElementUi插件库的使用
  • 利用python进行数据处理,得到对自己有利的内容
  • 微信小程序用开发工具在本地真机调试可以正常访问摄像头,发布了授权后却无法访问摄像头,解决方案
  • 信雅纳Chimera 100G网络损伤仪助力Parallel Wireless开展5G RAN无线前传网络的损伤模拟
  • 【电子通识】案例:两个按键同时按下把boot拉低电路如何设计?
  • VIT:论文关键点解读与常见疑问
  • mac安装jdk8
  • Linux——应用软件的生命周期
  • 0x3D service
  • 监督学习、无监督学习、半监督学习、强化学习、迁移学习、集成学习分别是什么对应什么应用场景
  • ReLitLRM: Generative Relightable Radiance for Large Reconstruction Models 论文解读
  • 二叉树刷题(JAVA)
  • NeRF三维重建—神经辐射场Neural Radiance Field(二)体渲染相关
  • Lua变量
  • 深⼊理解指针(2)
  • 进程间关系与守护进程
  • 【ELK】初始阶段
  • 2024年AI 制作PPT新宠儿,3款神器集锦,让你的演示与众不同
  • excel导出图片黑线简谈
  • 第一年改考408的学校有炸过的吗?怎么应对突然改考408?
  • URP学习四
  • 《Linux服务与安全管理》| 磁盘与文件系统管理
  • 《中安未来护照阅读器》
  • 机器学习课程学习周报十七