symbol【ES6】
你一闭眼世界就黑了,你不是主角是什么?
目录
- 什么是Symbol?
- Symbol特点:
- 创建方法:
- 注意点:
- 不能进行运算:
- 显示调用toString() --没有意义
- 隐式转换boolean
- 如果属性名冲突了怎么办?
- obj.name和obj[name]的区别:
- 变量命名:
- 避免直接写Symbol()代替变量:
- 整合变量:
- 接受传参:
- 不能进行for in 循环:
- Object.getOwnPropertySymbols():
- Reflect.ownKeys() 遍历属性名和属性值:
- 作为常量:
什么是Symbol?
ES6引入了一种新的原始数据类型 Symbol
,表示独一无二的值,它属于JavaScript语言的原生数据类型之一。
其他数据类型是: Undefined
、Null
、布尔值(Boolean
)、字符串(String
)、数值(Number
)、对象(Object
)。
Symbol特点:
- 由于每一个Symbol值都是不相等的,这意味着Symbol值可以作为标识符,用于对象的属性名,保证不会出现同名的属性。
- Symbol主要用于对象属性的唯一性标识,可以解决属性名冲突的问题。
创建方法:
let s1 = Symbol(); // 生成了一个symbol类型的数据
console.log(typeof s1); // symbol
每次创建都会生成一个独一无二的值:
let s1 = Symbol(); // 生成了一个symbol类型的数据
let s2 = Symbol();
console.log(s1 === s2); // false
注意点:
不能进行运算:
Symbol数据类型在JavaScript中是不能进行常规的数学运算的,包括加法(+)、减法(-)、乘法(*)、除法(/)以及比较运算(>、<、>=、<=)等。
let s1 = Symbol();
console.log(s1 + 'aaaa');// es6.html:16 Uncaught TypeError: Cannot convert a Symbol value to a string
显示调用toString() --没有意义
let s1 = Symbol();
console.log(s1.toString()); // Symbol()
console.log(s1.toString() + 'aaa'); // Symbol()aaa
隐式转换boolean
let s1 = Symbol();
// 这里的s1相当于true
if (s1) {console.log('执行');
}
如果属性名冲突了怎么办?
obj.name和obj[name]的区别:
点击 看 obj.name和obj[name]的区别
let obj = {name: 'sssssy',getName() {console.log(this.name);}
}let name = Symbol();
obj[name] = 'kitty'
console.log(obj);
console.log(obj.name); //sssssy
console.log(obj[name]); // kitty
变量命名:
所以写库的作者会尽量避免直接.xxx来进行命名:
let name = Symbol();
let age = Symbol();
let obj = {[name]: 'sssssy',[age]: 100
}
console.log(obj);
避免直接写Symbol()代替变量:
避免变量直接写 Symbol():
let obj = {[Symbol()]: '123', //这样虽然可以创建一个独一无二的值,但是访问不了。
}
console.log(obj[Symbol()]); // undefined 因为这里类似于创建了一个新的Symbol类型。
整合变量:
如果变量过多,也可以这样来写:
let keys = {name: Symbol(),age: Symbol(),loacation: Symbol(),test: Symbol(),
}let obj = {[keys.name]: 'sssssy',[keys.age]: 18,[keys.loacation]: '北京',[keys.test]() {console.log('test');}
}
console.log(obj);
console.log(obj[keys.name]); // sssssy
obj[keys.test](); // test
接受传参:
由于展开全是Symbol(),我不知道是哪个变量,所以可以往Symbol()的括号里面添加参数【接受传参】,让我们能看出是哪个变量:
let keys = {name: Symbol("name"),age: Symbol("age"),loacation: Symbol("location"),test: Symbol("test"),
}let obj = {[keys.name]: 'sssssy',[keys.age]: 18,[keys.loacation]: '北京',[keys.test]() {console.log('test');}
}
console.log(obj);
不能进行for in 循环:
let keys = {name: Symbol("name"),age: Symbol("age"),loacation: Symbol("location"),test: Symbol("test"),
}let obj = {name: '普通属性',[keys.name]: 'sssssy',[keys.age]: 18,[keys.loacation]: '北京',[keys.test]() {console.log('test');}
}for (let i in obj) {console.log(i);
}
只能打印出普通属性。。。
那该怎么办呢?
使用Object.getOwnPropertySymbols() 可以拿到所有的Symbol属性
Object.getOwnPropertySymbols():
let keys = {name: Symbol("name"),age: Symbol("age"),loacation: Symbol("location"),test: Symbol("test"),
}let obj = {name: '普通属性',[keys.name]: 'sssssy',[keys.age]: 18,[keys.loacation]: '北京',[keys.test]() {console.log('test');}
}console.log(Object.getOwnPropertySymbols(obj));
跪求既能拿到普通属性,又能拿到Symbol属性的方法!!!
好的。。平身。。。
就是使用:Reflect.ownKeys()
let keys = {name: Symbol("name"),age: Symbol("age"),loacation: Symbol("location"),test: Symbol("test"),
}let obj = {name: '普通属性',[keys.name]: 'sssssy',[keys.age]: 18,[keys.loacation]: '北京',[keys.test]() {console.log('test');}
}console.log(Reflect.ownKeys(obj));
老铁们把666打到公屏上!! 66666~6666~6666~
Reflect.ownKeys() 遍历属性名和属性值:
包含所有普通属性的和Symbol属性的:
let keys = {name: Symbol("name"),age: Symbol("age"),loacation: Symbol("location"),test: Symbol("test"),
}let obj = {name: '普通属性',[keys.name]: 'sssssy',[keys.age]: 18,[keys.loacation]: '北京',[keys.test]() {console.log('test');}
}Reflect.ownKeys(obj).forEach(item => {console.log(item, obj[item]);
})
作为常量:
正常调用:
function play(type) {switch (type) {case 1:console.log('视频播放');break;case 2:console.log('音频播放');break;case 3:console.log('图片播放');break;}
}
play(1) // 视频播放
play(2) // 音频播放
play(3) // 图片播放
1 2 3这样数字写的用户不理解,我们把它们换成可理解的:
但是这样如果我提前知道这些数字,依旧可以通过数字去调用到
const VIDEO = 1;
const AUDIO = 2;
const IMAGE = 3;
function play(type) {switch (type) {case VIDEO:console.log('视频播放');break;case AUDIO:console.log('音频播放');break;case IMAGE:console.log('图片播放');break;}
}
play(VIDEO) // 视频播放
play(1) // 视频播放
这时候就可以使用Symbol作为一个常量:(也就是作为一种应用,统一代码的一致性)
const VIDEO = Symbol();
const AUDIO = Symbol();
const IMAGE = Symbol();
function play(type) {switch (type) {case VIDEO:console.log('视频播放');break;case AUDIO:console.log('音频播放');break;case IMAGE:console.log('图片播放');break;}
}
play(VIDEO) // 视频播放
play(1) // 什么都没有
相关文章:
symbol【ES6】
你一闭眼世界就黑了,你不是主角是什么? 目录 什么是Symbol?Symbol特点:创建方法:注意点:不能进行运算:显示调用toString() --没有意义隐式转换boolean 如果属性名冲突了怎么办?o…...
如何用数据可视化提升你的决策力?
在数字化浪潮席卷全球的当下,数据已然成为企业和组织发展的核心资产。然而,单纯的数据堆积犹如未经雕琢的璞玉,难以直接为决策提供清晰有力的支持。数据可视化作为一种强大的工具,能够将海量、复杂的数据转化为直观、易懂的图形、…...
【C++】vector容器实现
目录 一、vector的成员变量 二、vector手动实现 (1)构造 (2)析构 (3)尾插 (4)扩容 (5)[ ]运算符重载 5.1 迭代器的实现: (6&…...
C语言求1到n的和(附带源码和解析)
在C语言中,使用 for 循环求 1 到 n 的和是一个常见的编程任务。这个任务不仅可以帮助初学者理解循环的基本概念,还能培养他们的逻辑思维能力。 要计算 1 到 n 的和,我们需要创建一个循环,从 1 开始,一直累加到 n。for…...
springboot3+vue3融合项目实战-大事件文章管理系统-文章分类也表查询(条件分页)
在pojo实体类中增加pagebean实体类 Data NoArgsConstructor AllArgsConstructor public class PageBean <T>{private Long total;//总条数private List<T> items;//当前页数据集合 }articlecontroller增加代码 GetMappingpublic Result<PageBean<Article&g…...
java中定时任务的实现及使用场景
在 Java 需要中,定时任务的实现方式有单线程模型的 Timer 类、线程池定时任务的 ScheduleExecutorService、spring 框架提供的注解Schedule 定时任务,第三个框架定时任务比如 XX-Job,Quartz 等。 Java 任务调度组件对比与使用指南 一、核心功能对比 特…...
使用 OpenCV 实现哈哈镜效果
在计算机视觉和图像处理领域,OpenCV 提供了非常强大的图像几何变换能力,不仅可以用于纠正图像,还能制造各种“有趣”的视觉效果。今天,我们就来实现一个经典的“哈哈镜”效果,让图像像在游乐园里一样被拉伸、压缩、扭曲…...
【Java高阶面经:微服务篇】9.微服务高可用全攻略:从架构设计到自动容灾
一、架构层:构建抗故障的分布式基石 1.1 多维度冗余设计 1.1.1 跨可用区部署策略 # Kubernetes跨可用区反亲和性配置 apiVersion: apps/v1 kind: Deployment metadata:name: product-service spec:replicas: 3template:spec:affinity:podAntiAffinity:requiredDuringSchedu…...
读一本书第一遍是快读还是细读?
在时间充足且计划对重要书籍进行多遍阅读的前提下,第一遍阅读的策略可以结合**「快读搭建框架」与「标记重点」**,为后续细读奠定基础。以下是具体建议及操作逻辑: 一、第一遍:快读为主,目标是「建立全局认知」 1. 快…...
COMPUTEX 2025 | 广和通5G AI MiFi解决方案助力移动宽带终端迈向AI新未来
随着5G与AI不断融合,稳定高速、智能的移动网络已成为商务、旅行、户外作业等场景的刚需。广和通5G AI MiFi方案凭借领先技术与创新设计,重新定义5G移动网络体验。 广和通5G AI MiFi 方案搭载高通 4nm制程QCM4490平台,融合手机级超低功耗技术…...
JAVA批量发送邮件(含excel内容)
EmailSenderHtmlV1 是读取配置文件《批量发送邮件.xlsx》,配置sheet获取 发件人邮箱 邮箱账号 口令,发送excel数据sheet获取收件人邮箱 抄送人邮箱 邮件标题 第N行开始(N>1,N0默认表头) 第M行结束(M>1,M0默认表头) 附件文件夹…...
MyBatis 关联映射深度解析:_association_ 与 _collection_ 实战教程
一、核心概念与适用场景 在 MyBatis 中,<association> 和 <collection> 用于处理对象间的关联关系,简化复杂查询到对象结构的映射。 标签用途对应关系示例场景<association>映射 单个嵌套对象(“有一个”关系)一对一、多对一员工 (Emp) 属于一个部门 (D…...
NSSCTF [watevrCTF 2019]Wat-sql
90.[watevrCTF 2019]Wat-sql(逻辑漏洞) [watevrCTF 2019]Wat-sql (1) 1.准备 motalymotaly-VMware-Virtual-Platform:~$ file sql sql: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linu…...
C++ 前缀和数组
一. 一维数组前缀和 1.1. 定义 前缀和算法通过预处理数组,计算从起始位置到每个位置的和,生成一个新的数组(前缀和数组)。利用该数组,可以快速计算任意区间的和,快速求出数组中某一段连续区间的和。 1.2. …...
免费使用GPU的探索笔记
多种有免费时长的平台 https://www.cnblogs.com/java-note/p/18760386 Kaggle免费使用GPU的探索 https://www.kaggle.com/ 注册Kaggle账号 访问Kaggle官网,使用邮箱注册账号。 发现gpu都是灰色的 返回home,右上角的头像点开 验证手机号 再次code-you…...
【css】 flex布局基本知识
Flexible Box 模型,是一种一维的布局模型。一个 flexbox 一次只能处理一个维度上的元素布局,一行或者一列。 轴线 flex 属性与主轴和交叉轴有关,通过flex-direction定义 主轴由 flex-direction 定义,可以取 4 个值:…...
3D Gaussian Splatting for Real-Time Radiance Field Rendering——文章方法精解
SfM → Point-NeRF → 3D Gaussian Splatting 🟦SfM Structure-from-Motion(运动恢复结构,简称 SfM)是一种计算机视觉技术,可以: 利用多张从不同角度拍摄的图像,恢复出场景的三维结构和相机的…...
RestTemplate 发送的字段第二个大写字母变成小写的问题探究
在使用RestTemplate 发送http 请求的时候,发现nDecisonVar 转换成了ndecisonVar ,但是打印日志用fastjson 打印的没有问题,换成jackson 打印就有问题。因为RestTemplate 默认使用的jackson 作为json 序列化方式,导致的问题,但是为…...
第二次中医知识问答微调
由于昨天微调效果并不理想,因此更换数据集和参数进行重新进行了微调 本次微调参数如下: llamafactory-cli train \ --stage sft \ --do_train True \ --model_name_or_path /home/qhyz/zxy/LLaMA-Factory/model \ --preprocessing_num_workers 16 \ --…...
Linux查 ssh端口号和服务状态
一、检查SSH服务运行状态 通过进程查看命令验证服务是否启动: ps -ef | grep ssh当输出包含sshd进程时,表示SSH服务正在运行。示例输出: root 1234 1 0 10:00 ? 00:00:00 /usr/sbin/sshd二、查看服务监听端口 使用网络…...
C++ 11(1):
C11的发展史: C11中的{}: 看这个图片,我们的C11是所有的对象都可以使用{}来进行初始化,之前我们的int类型的数据要使用赋值符号来进行初始化,现在的话我们可以直接使用花括号来进行,并且连赋值符号都可以去…...
数据结构(4)线性表-链表-双链表
一、链表的分类 迟来的分类,主要如果在学习单链表前去讲分类,可能就云里雾里的,所以放在讲完单链表后讲。 划分链表的标准如下: 有没有头结点、指针的方向、循环与否 头结点就是一个占位结点,也被叫做哨兵位&#x…...
Spring Framework 的 spring-core 和 Spring Security 兼容版本
Spring Framework 的 spring-core 和 Spring Security 兼容版本 Spring Framework 的 spring-core 和 Spring Security 的版本需要保持兼容性,尤其是在旧版本(如 Spring 4.x)中。以下是它们的版本对应关系: Spring 4.x (spring-c…...
《国家职业教育平台:点亮职业教育新灯塔》
职教新航标:平台诞生记 国家职业教育智慧教育平台 在科技飞速发展的今天,数字化浪潮席卷全球,深刻地改变着我们生活的方方面面,教育领域也不例外。随着信息技术的不断进步,教育数字化已成为当今世界教育发展的重要趋势…...
Java多线程深度解析:从核心机制到高阶实战
Java多线程深度解析:从核心机制到高阶实战 摘要:本文系统解析Java多线程全体系知识,涵盖线程实现原理、并发工具实战、锁机制底层实现、线程池参数调优策略,并提供20可运行代码片段。附内存模型原理与性能优化指南。 目录 线程基…...
大量程粗糙度轮廓仪适用于哪些材质和表面?
大量程粗糙度轮廓仪是一种能够在广泛的测量范围内对工件表面进行粗糙度分析的精密仪器。它通常采用接触式或非接触式传感器,通过对工件表面的扫描,捕捉表面微观的起伏和波动,从而获取粗糙度数据。该仪器不仅能测量微小的表面细节,…...
NC028NQ472美光固态颗粒NQ484NQ485
深度解析:NC028NQ472、NQ484与NQ485美光固态颗粒 技术架构解析:堆叠式存储与算法优化 美光NC028NQ472、NQ484及NQ485系列固态颗粒均采用自研3D TLC NAND闪存技术,其核心架构通过垂直堆叠存储单元实现高密度集成。以NQ472为例,采…...
Cursor神一样的存在,核心能力codebase是如何工作的?
最近宣布达到 3 亿美元年度经常性收入,已经成为vibe coding标配。核心能力来自于Codebase。根据官方说法,codebase实现是依赖使用 Merkle 树来快速索引代码。但是没有竞品模仿这种方法。 Merkle是如何工作的那? Merkle 树简单解释 Merkle …...
python代码绘制某只股票最近90天的K线图、均线、量能图
运行代码,要求输入股票代码和名称,其他参数可省略 import akshare as ak import matplotlib.pyplot as plt import pandas as pd import mplfinance as mpf import matplotlib.dates as mdates import numpy as np import os from datetime import date…...
upload-labs通关笔记-第15关 文件上传之getimagesize绕过(图片马)
目录 一、图片马 二、文件包含 三、文件包含与图片马 四、图片马制作方法 五、源码分析 六、制作图片马 1、创建脚本并命名为test.php 2、准备制作图片马的三类图片 3、 使用copy命令制作图片马 七、渗透实战 1、GIF图片马渗透 (1)上传gif图…...
反弹shell
shell了解 shell其xxxx是交互,点鼠标敲键盘与计算机进行交互,还有常见的shell(cmd,powershell) shell反弹 当远程连接shell(windows远程桌面,linux有SSH之类),从外面远…...
【动手学深度学习】1.3. 各种机器学习问题
目录 1.3. 各种机器学习问题1)监督学习(supervisedlearning)(1)回归(regression)(2)分类(classification)(3)标记问题&…...
OS进程调度
tss Q1:你是如何保证两个进程不能同时访问共享资源的? ✅ 推荐回答: 我实现了基于结构体的互斥锁,使用 mutex_lock() 来加锁资源。如果已有任务持有锁,则当前任务会被阻塞并加入等待队列,直到被唤醒。解锁…...
MCP和 AI agent 有什么区别和联系
MCP 是什么? MCP(Model Context Protocol,模型上下文协议)是一种开源通信协议,旨在为大型语言模型(LLM)与外部数据源、工具或服务之间建立标准化、安全且灵活的双向连接。它类似于“AI 的 USB-…...
用Recommenders,实现个性化推荐
文章目录 引言一、Recommenders简介二、选择Recommenders的原因三、智能推荐系统的设计与实现四、总结 引言 在这个信息如洪流般涌来的时代,你是否常常在茫茫的信息海洋中迷失方向,为找不到自己心仪的内容而苦恼?今天咱们就来聊聊基于Micros…...
MCP-1:MCP组件与工作流程
MCP-1:MCP组件与工作流程 1.什么是MCP2.MCP架构组件2.1.MCP Hosts2.2.MCP Client2.3.MCP Server3.交互流程3.1.用户提问3.2.LLM 推理选择MCP Server(大模型规划)3.3.调用 MCP Tool3.4.返回结果3.5.数据清洗3.6.反馈信息给用户1.什么是MCP MCP(Model Context Proto…...
NVIDIA GPU 性能调优与诊断完全指南
本文为多 GPU 用户(如 3*RTX A4000 系统)提供一份全面的调优与诊断手册,涵盖功率限制、风扇控制、频率锁定、缓存清理、GPU 重置与性能测试工具等操作命令,适合开发者与研究人员在部署前进行系统级优化与验证。 📌 目录…...
从运维告警到业务决策:可观测性正在重新定义企业数据基础设施
可观测性(Observability)与传统监控(Monitoring)的核心差异,本质上是一种数据维度的主动暴露与被动采集的范式转变。传统监控就像在黑暗森林中设置有限的探照灯,运维人员必须预先假设可能的故障路径&#x…...
配电网运行状态综合评估方法研究
1评估指标体系的构建 [1]冷华,童莹,李欣然,等.配电网运行状态综合评估方法研究[J].电力系统保护与控制,2017,45(01):53-59. 1.1评估范围 图1为配电系统组成示意图,其中A、B、C分别表示高、中、低压配电系统。高压配变(也称主变)将35kV或110kV的电压降到10kV&#…...
Linux中I/O复用机制epoll
1. 为什么会出现 epoll? 在早期的网络编程中,select 是一个非常常用的 I/O 复用机制,用于在多个文件描述符(如套接字)上进行 I/O 操作的检测。select 会将多个文件描述符传入,轮询检查它们的状态ÿ…...
数据库表关系详解
一、一对多关系 特征:表A的一条记录对应表B的多条记录,表B的一条记录仅对应表A的一条记录 示例: 学生表(子表) | id | name | class_id | |-----|------|----------| |1001| 张三 | 111 | |1002| 张四 | 222 | 班级表…...
Agentic Loop与MCP:大模型能力扩展技术解析
一、什么是MCP MCP(Model Context Protocol)是一种用于大语言模型与外部工具交互的协议框架。它允许大语言模型能够调用各种外部工具来扩展其能力边界,如访问文件系统、搜索引擎、数据库等。 MCP的核心价值 能力扩展:使大语言模…...
贪心算法 Part04
总结下重叠区间问题 LC 452. 用最少数量的箭引爆气球 和 LC 435. 无重叠区间 本质上是一样的。 LC 452. 用最少数量的箭引爆气球 是求n个区间当中 , 区间的种类数量 k。此处可以理解为,重叠在一起的区间属于同一品种,没有重叠的区间当然…...
Spring事务简单操作
什么是事务? 事务是一组操作的集合,是一个不可分割的操作 事务会把所有的操作作为⼀个整体, ⼀起向数据库提交或者是撤销操作请求. 所以这组操作要么同时 成功, 要么同时失败. 事务的操作 分为三步: 1. 开启事start transaction/ begin …...
04算法学习_209.长度最小的子数组
04算法学习_209.长度最小的子数组题目描述:个人代码:学习思路:第一种写法:题解关键点: 第二种写法:题解关键点: 个人学习时疑惑点解答: 04算法学习_209.长度最小的子数组 力扣题目链…...
./build/mkfs.jffs2: Command not found
参考文章:https://blog.csdn.net/FLM19990626/article/details/132070195 sudo apt-get install lib32stdc6 sudo apt-get install lib32z1 sudo apt-get install mtd-utils sudo apt-get install man-db sudo apt-get install liblzo2-dev:i386sudo ldconfig...
从零基础到最佳实践:Vue.js 系列(4/10):《Vue Router 路由管理:深入探索与实战应用》
引言 在现代前端开发中,单页应用(SPA)凭借其流畅的用户体验和高性能成为主流。Vue Router 作为 Vue.js 的官方路由管理工具,为开发者提供了强大的路由管理能力,帮助实现页面导航、权限控制和动态内容加载。本文将从基…...
深入解析C++静态成员变量与函数
当然可以!下面是对这段 C 代码的逐行详细注释说明和解释,帮助你理解静态成员变量和静态成员函数的使用。 🧱 类定义部分:MyClass cpp 深色版本 #include <iostream> 说明:包含标准输入输出流库,用于…...
基于JDBC的信息管理系统,那么什么是JDBC呢?什么又是DAO类?
1.JDBC JDBC 即 Java Database Connectivity,是 Java 语言中用于与数据库进行交互的一套 API。它提供了一种标准的方式,让 Java 程序能够连接到各种不同类型的数据库,并执行 SQL 语句来实现对数据库的查询、插入、更新和删除等操作。 主要功…...
Java虚拟机 -虚拟机栈
虚拟机栈详解 虚拟机栈概述案例常见的跟虚拟栈异常相关的异常StackOverflowError异常OutOfMemoryError异常 栈的基本存储单位局部变量表IDEA Jclasslib Bytecode Viewer插件slot 操作数栈方法调用(待后续补充) 虚拟机栈 上一篇文章,我们简单…...