JS中Symbol (符号)数据类型详解和应用场景

JavaScript中Symbol数据类型详解

Symbol是ES6引入的一种原始数据类型,表示唯一的标识符。它是通过Symbol()函数生成的,每次调用都会返回一个独一无二的值。Symbol值的主要用途是为对象的属性提供唯一标识,以避免属性名冲突。


特点

  1. 唯一性
    每个通过Symbol()创建的Symbol值都是唯一的,即使它们的描述相同。

    const sym1 = Symbol('description');
    const sym2 = Symbol('description');
    console.log(sym1 === sym2); // false
    
  2. 不可变性
    Symbol值是原始数据类型,且一旦创建就不可更改。

  3. 可选描述
    Symbol()可以接受一个字符串作为描述,仅用于调试或日志记录,不影响其唯一性。

  4. 不能与其他类型隐式转换
    Symbol不能与字符串或数字进行隐式类型转换。

    const sym = Symbol('example');
    console.log(`My symbol is: ${sym}`); // TypeError
    
  5. 用于对象属性
    Symbol值可以作为对象的键,这样的属性是不可枚举的。


Symbol的创建方式

  1. 普通创建

    const sym = Symbol();
    const symWithDesc = Symbol('description');
    
  2. 全局共享的Symbol
    使用Symbol.forSymbol.keyFor管理全局Symbol。

    const globalSym1 = Symbol.for('key');
    const globalSym2 = Symbol.for('key');
    console.log(globalSym1 === globalSym2); // trueconst key = Symbol.keyFor(globalSym1);
    console.log(key); // 'key'
    

Symbol的应用场景

  1. 对象属性的唯一键
    使用Symbol作为对象的键,避免属性名冲突。

    const uniqueKey = Symbol('id');
    const user = {[uniqueKey]: 12345,name: 'John Doe'
    };console.log(user[uniqueKey]); // 12345
    console.log(Object.keys(user)); // ['name'],Symbol键不可枚举
    
  2. 模拟私有属性
    Symbol属性不会被for...inObject.keys()枚举,因此可以用来模拟私有属性。

    const privateKey = Symbol('private');
    class Person {constructor(name) {this.name = name;this[privateKey] = 'secret';}getPrivateKey() {return this[privateKey];}
    }const person = new Person('Alice');
    console.log(person.name); // 'Alice'
    console.log(person.privateKey); // undefined
    console.log(person.getPrivateKey()); // 'secret'
    
  3. 定义常量枚举
    Symbol可以用于定义一组常量,避免相互干扰。

    const COLORS = {RED: Symbol('red'),GREEN: Symbol('green'),BLUE: Symbol('blue')
    };function getColorDescription(color) {switch (color) {case COLORS.RED:return 'Color is Red';case COLORS.GREEN:return 'Color is Green';case COLORS.BLUE:return 'Color is Blue';default:return 'Unknown Color';}
    }console.log(getColorDescription(COLORS.RED)); // 'Color is Red'
    
  4. 扩展内置对象的功能
    使用Symbol作为方法名,可以扩展内置对象的功能,而不会破坏其默认行为。

    const myArray = [1, 2, 3];
    const customIterator = Symbol('customIterator');myArray[customIterator] = function* () {for (const item of this) {yield item * 2;}
    };for (const value of myArray[customIterator]()) {console.log(value); // 2, 4, 6
    }
    
  5. 元编程(Symbol内置方法)
    Symbol提供了一组内置的静态属性,用于改变对象的默认行为:

    • Symbol.iterator:定义对象的迭代行为。
    • Symbol.toStringTag:自定义toString方法返回的值。
    • Symbol.hasInstance:自定义instanceof行为。

    示例:使用Symbol.iterator

    const iterableObject = {data: [10, 20, 30],[Symbol.iterator]() {let index = 0;const self = this;return {next() {if (index < self.data.length) {return { value: self.data[index++], done: false };} else {return { done: true };}}};}
    };for (const value of iterableObject) {console.log(value); // 10, 20, 30
    }
    

注意事项

  1. Symbol不是私有的
    虽然Symbol属性不可枚举,但它仍然可以通过Object.getOwnPropertySymbols()获取。

  2. 调试困难
    使用过多的Symbol可能导致调试时难以识别其含义。


总结

Symbol作为JavaScript中一种独特的数据类型,具有唯一性和不可枚举性,非常适合用于避免属性名冲突、定义私有属性以及扩展对象的功能。合理地使用Symbol可以提升代码的可读性和健壮性,但应避免过度使用。

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

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

相关文章

如何在网页端使用 IDE 高效地阅读 GitHub 源码?

如何在网页端使用 IDE 高效地阅读 GitHub 源码&#xff1f; 前言什么是 GitHub1s&#xff1f;使用 GitHub1s 阅读 browser-use 项目源码步骤 1: 打开 GitHub 项目页面步骤 2: 修改 URL 使用 GitHub1s步骤 3: 浏览文件结构步骤 4: 使用代码高亮和智能补全功能步骤 5: 快速跳转和…

Web Bluetooth API 开发记录

搞了一天的蓝牙串口协议被几个软件和AI带沟里面去了。 1.00001101-0000-1000-8000-00805f9b34fb 是spp协议。但是我用的称是使用的49535343-fe7d-4ae5-8fa9-9fafd205e455蓝牙低功耗spp协议 2.推荐一款软件Android-nRF-Connect github地址&#xff1a;https://github.com/Nor…

使用VS Code开发ThinkPHP项目

【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《ThinkPHP 8高效构建Web应用 夏磊 编程与应用开发丛书 清华大学出版社》【摘要 书评 试读】- 京东图书 ThinkPHP 8开发环境安装-CSDN博客 安装ThinkPHP项目的IDE 常用的集成开发环境&#xff08;IDE&#xff09;包括P…

开源轻量级文件分享服务Go File本地Docker部署与远程访问

???欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老…

Windows上缺少xaudio2_9.dll是什么原因?

一、文件丢失问题&#xff1a;Windows上缺少xaudio2_9.dll是什么原因&#xff1f; xaudio2_9.dll是DirectX音频处理库的一个组件&#xff0c;它支持游戏中的音频处理功能。当你在Windows系统上运行某些游戏或音频软件时&#xff0c;如果系统提示缺少xaudio2_9.dll文件&#xf…

缓存管理自动化:JuiceFS 企业版 Cache Group Operator 新特性发布

近期&#xff0c;JuiceFS 企业版推出了 Cache Group Operator&#xff0c;用于自动化创建和管理缓存组集群。Operator 是一种简化 Kubernetes 应用管理的工具&#xff0c;它能够自动化应用程序的生命周期管理任务&#xff0c;使部署、扩展和运维更加高效。 在推出 Operator 之前…

SCSA:探索空间与通道注意力之间的协同效应

文章目录 摘要1 引言2 相关工作2.1 多语义空间信息2.2 注意力分解 3 方法3.1 共享多语义空间注意力&#xff1a;空间与通道分解3.2 渐进式通道自注意力3.3 协同效应3.4 注意力机制的整合 4 实验4.1 实验设置4.2 图像分类4.3 目标检测4.4 分割4.5 消融研究 5 可视化与分析5.1 注…

Grok 2.0:马斯克的大模型挑战ChatGPT,AI竞争再升级

引言&#xff1a;马斯克Grok 2.0的横空出世 在人工智能&#xff08;AI&#xff09;领域&#xff0c;竞争从未停止。随着大型语言模型&#xff08;LLM&#xff09;的快速发展&#xff0c;各大科技巨头纷纷推出自己的AI模型&#xff0c;试图在激烈的竞争中占据领先地位。最近&am…

基于Spring Boot的宠物领养系统的设计与实现(代码+数据库+LW)

摘 要 如今社会上各行各业&#xff0c;都在用属于自己专用的软件来进行工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。互联网的发展&#xff0c;离不开一些新的技术&#xff0c;而新技术的产生往往是为了解决现有问题而产生的。针对于宠物领…

安卓15预置第三方apk时签名报错问题解决

有同事反馈集成apk时安装失败 PackageManager: Failed to scan /product/app/test: No APK Signature Scheme v2 signature in package /product/app/test/test.apk 查看编译后的apk签名信息 DOES NOT VERIFY ERROR: JAR signer CERT.RSA: JAR signature META-INF/CERT.SF indi…

从0入门自主空中机器人-2-1【无人机硬件框架】

关于本课程&#xff1a; 本次课程是一套面向对自主空中机器人感兴趣的学生、爱好者、相关从业人员的免费课程&#xff0c;包含了从硬件组装、机载电脑环境设置、代码部署、实机实验等全套详细流程&#xff0c;带你从0开始&#xff0c;组装属于自己的自主无人机&#xff0c;并让…

实现某海外大型车企(T)Cabin Wi-Fi 需求的概述 - 4

大家好&#xff0c;我是Q&#xff0c;邮箱&#xff1a;1042484520qq.com。 今天我们在上几讲的基础上再扩展下 Cabin Wi-Fi 的功能需求&#xff0c;讲讲如何使能 5G TCU Wi-Fi STA Bridge 模式。 参考&#xff1a; 实现某海外大型车企&#xff08;T&#xff09;Cabin Wi-Fi 需求…

2024 年最新 windows 操作系统搭建部署 nginx 服务器应用详细教程(更新中)

nginx 服务器概述 Nginx 是一款高性能的 HTTP 和 反向代理 服务器&#xff0c;同时是一个 IMAP / POP3 / SMTP 代理服务器。Nginx 凭借其高性能、稳定性、丰富的功能集、简单的配置和低资源消耗而闻名。 浏览 nginx 官网&#xff1a;https://nginx.org/ Nginx 应用场景 静态…

C 实现植物大战僵尸(二)

C 实现植物大战僵尸&#xff08;二&#xff09; 前文链接&#xff0c;C 实现植物大战僵尸&#xff08;一&#xff09; 五 制作启动菜单 启动菜单函数 void startUI() {IMAGE imageBg, imgMenu1, imgMenu2;loadimage(&imageBg, "res/menu.png");loadimage(&am…

Android笔记(四十一):TabLayout内的tab不滚动问题

背景 假设二级页面是上面图片的布局&#xff0c;当进来时TabLayout和ViewPager2绑定完就马上调setCustomItem&#xff0c;跳转到最后一个tab页面时&#xff0c;会发现tab不滚动&#xff0c;手动滑一下ViewPager2时才会滚动tab到正确的位置 原因分析 调用TabLayoutMediator.at…

域内的三种委派方式

域委派&#xff1a;使得上游服务能使用用户凭据访问下游服务&#xff0c;使得下游服务根据域用户判断权限&#xff0c;例如&#xff1a; web 用户 hack ---------------访问------------------> web 服务器 &#xff08; www-data 域服务账户运行&#xff09;-------------…

GEE云计算、多源遥感、高光谱遥感技术蓝碳储量估算;红树林植被指数计算及提取

大气温室气体浓度不断增加&#xff0c;导致气候变暖加剧&#xff0c;随之会引发一系列气象、生态和环境灾害。如何降低温室气体浓度和应对气候变化已成为全球关注的焦点。海洋是地球上最大的“碳库”,“蓝碳”即海洋活动以及海洋生物&#xff08;特别是红树林、盐沼和海草&…

module ‘django.db.models‘ has no attribute ‘FieldDoesNotExist‘

module ‘django.db.models’ has no attribute ‘FieldDoesNotExist’ xadmin报错 原因 django与xadmin版本不匹配。 django==3.2.7 xadmin-django==3.0.2解决方案 在xadmin/view/edit.py的388行改为 from django.core import exceptions if self.request_method ==

数据结构(哈希表(中)纯概念版)

前言 哈希表&#xff08;Hash Table&#xff09;是计算机科学中的一个基础而重要的数据结构&#xff0c;它广泛评估各种算法和系统中&#xff0c;尤其是在需要快速查找、插入和删除操作的场景中。由于其O( 1)的平均时间复杂度&#xff0c;存储表在性能要求较高的应用中表现得非…

计算机网络 (12)物理层下面的传输媒体

前言 计算机网络物理层下面的传输媒体是计算机网络设备之间的物理通路&#xff0c;也称为传输介质或传输媒介&#xff0c;并不包含在计算机网络体系结构中&#xff0c;而是处于物理层之下。 一、传输媒体的分类 导向型媒体&#xff1a;电磁波被导引沿着固体媒体传播。常见的导向…