symbol【ES6】

你一闭眼世界就黑了,你不是主角是什么?

目录

  • 什么是Symbol?
  • ‌Symbol特点‌:
  • 创建方法:
  • 注意点:
    • 不能进行运算:
    • 显示调用toString() --没有意义
    • 隐式转换boolean
  • 如果属性名冲突了怎么办?
    • obj.name和obj[name]的区别:
    • 变量命名:
    • 避免直接写Symbol()代替变量:
    • 整合变量:
  • 接受传参:
  • 不能进行for in 循环:
    • Object.getOwnPropertySymbols():
    • Reflect.ownKeys() 遍历属性名和属性值:
  • 作为常量:

什么是Symbol?

ES6引入了一种新的原始数据类型 Symbol表示独一无二的值,它属于JavaScript语言的原生数据类型之一。
其他数据类型是: UndefinedNull、布尔值(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) // 什么都没有

在这里插入图片描述

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

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

相关文章

LeetCode 649. Dota2 参议院 java题解

https://leetcode.cn/problems/dota2-senate/description/ 贪心。不会写。 class Solution {public String predictPartyVictory(String senate) {boolean rtrue,dtrue;int flag0;//flag>0,d前面有r;flag<0,r前面有dchar[] senatessenate.toCharArray();//每一轮while(r…

机器学习第二十二讲:感知机 → 模仿大脑神经元的开关系统

机器学习第二十二讲&#xff1a;感知机 → 模仿大脑神经元的开关系统 资料取自《零基础学机器学习》。 查看总目录&#xff1a;学习大纲 关于DeepSeek本地部署指南可以看下我之前写的文章&#xff1a;DeepSeek R1本地与线上满血版部署&#xff1a;超详细手把手指南 感知机详解…

maven快速上手

之前我们项目如果要用到其他额外的jar包&#xff0c;需要自己去官网下载并且导入。但是有maven后&#xff0c;直接在maven的pom.xml文件里用代码配置即可&#xff0c;配置好后maven会自动帮我们联网下载并且会自动导入该jar包 在右边的maven中&#xff0c;我们可以看到下载安装…

科学养生指南:解锁健康生活密码

健康是人生最宝贵的财富&#xff0c;在快节奏的现代生活中&#xff0c;科学养生成为保持良好状态的关键。遵循现代医学与营养学的研究成果&#xff0c;无需依赖传统中医理论&#xff0c;我们也能找到适合自己的养生之道。​ 均衡饮食是健康的基石。现代营养学强调 “食物多样&…

Qt状态机QStateMachine

QStateMachine QState 提供了一种强大且灵活的方式来表示状态机中的状态&#xff0c;通过与状态机类(QStateMachine)和转换类(QSignalTransition&#xff0c; QEventTransition)结合&#xff0c;可以实现复杂的状态逻辑和用户交互。合理使用嵌套状态机、信号转换、动作与动画、…

C++八股 —— 原子操作

文章目录 1. 什么是原子操作2. 原子操作的特点3. 原子操作的底层原理4. 内存序内存屏障 5. 原子操作和互斥锁的对比6. 常用的原子操作7. 相关问题讨论 参考&#xff1a; C atomic 原子操作_c 原子操作-CSDN博客DeepSeek 1. 什么是原子操作 原子操作&#xff08;Atomic Opera…

双紫擒龙紫紫红指标源码学习,2025升级版紫紫红指标公式-重点技术

VAR1:MA((LOWHIGHCLOSE)/3,5); VAR2:CLOSEHHV(C,4) AND REF(C,1)LLV(C,4); 双紫擒龙:REF(C,1)LLV(C,4) AND C>REF(C,2) OR REF(C,2)LLV(C,4) AND REF(C,1)<REF(C,3) AND REF(C,2)<REF(C,4) AND C>REF(C,1); VAR4:VAR1>REF(VAR1,1) AND REF(VAR1,1)<REF(VAR1,…

NeuralRecon技术详解:从单目视频中实现三维重建

引言 三维重建是计算机视觉领域中的一项关键技术&#xff0c;它能够从二维图像中恢复出三维形状和结构。随着深度学习的发展&#xff0c;基于学习的方法已经成为三维重建的主流。NeuralRecon是一种先进的三维重建方法&#xff0c;它能够从单目视频中实时生成高质量的三维模型。…

Ubuntu 上开启 SSH 服务、禁用密码登录并仅允许密钥认证

1. 安装 OpenSSH 服务 如果尚未安装 SSH 服务&#xff0c;运行以下命令&#xff1a; sudo apt update sudo apt install openssh-server2. 启动 SSH 服务并设置开机自启 sudo systemctl start ssh sudo systemctl enable ssh3. 生成 SSH 密钥对&#xff08;本地机器&#xf…

MySQL 索引的增删改查

MySQL 索引的增删改查 1 建表时创建索引 [UNIQUE|FULLTEXT|SPATIAL] INDEX|KEY [别名] (字段名 [(长度)] [ASC|DESC] )主键直接写&#xff1a; PRIMARY KEY (Id)例如&#xff1a; CREATE TABLE people (id int NOT NULL PRIMARY KEY AUTO_INCREMENT,last_name varchar(10)…

为什么现代CSS应该选择OKLCH:从颜色科学到设计系统革新

在数字界面中&#xff0c;颜色不仅是美学的载体&#xff0c;更是信息传递的重要工具。CSS Color Level 4 标准引入了 OKLCH 颜色空间, 提供​​感知均匀性​​&#xff08;颜色差异与实际视觉感受一致&#xff09;&#xff0c;解决传统HSL/HSV在调整颜色时的不自然问题。文本帮…

【java】小练习--零钱通

文章目录 前言一、项目开发流程说明二、功能实现2.1 菜单2.2 零钱通明细2.3 零钱通收益2.4 零钱通消费2.5 零钱通退出确认2.6 零钱通金额校验2.7 完整代码 三、零钱通OOP版 前言 本文是我跟着B站韩顺平老师的 Java 教程学习时动手实现“零钱通”项目的学习笔记&#xff0c;主要…

人工智能数学基础实验(四):最大似然估计的-AI 模型训练与参数优化

一、实验目的 理解最大似然估计&#xff08;MLE&#xff09;原理&#xff1a;掌握通过最大化数据出现概率估计模型参数的核心思想。实现 MLE 与 AI 模型结合&#xff1a;使用 MLE 手动估计朴素贝叶斯模型参数&#xff0c;并与 Scikit-learn 内置模型对比&#xff0c;深入理解参…

我的第1个爬虫程序——豆瓣Top250爬虫的详细步骤指南

我的第1个爬虫程序——豆瓣Top250爬虫的详细步骤指南 一、创建隔离开发环境 1. 使用虚拟环境&#xff08;推荐venv&#xff09; # 在项目目录打开终端执行 python -m venv douban_env # 创建虚拟环境 source douban_env/bin/activate # Linux/macOS激活 douban_env\Scri…

STM32八股【11】-----Linux Bootloader (U-Boot)

参考U-Boot U-Boot是什么 嵌入式Linux系统需要一个bootloader来加载系统 U-boot就是一个通用开源的嵌入式Linux bootloader 主要实现的功能&#xff1a; 初始化硬件资源&#xff08;如内存、串口、存储器等&#xff09;从存储介质加载Linux内核到内存中传递启动参数给内核启…

【设计模式】责任链+模板+工程模式使用模板

前言 方便写出优雅&#xff0c;解耦&#xff0c;高内聚&#xff0c;高复用的代码。 Demo // 1. 定义验证器接口&#xff08;责任链模式&#xff09; public interface Validator {Validator setNext(Validator next);boolean validate(Data data); }// 2. 创建抽象验证器&am…

Unity3D仿星露谷物语开发49之创建云杉树

1、目标 创建一颗既可以生长又可以砍伐的云杉树&#xff0c;这个和之前创建橡树类似。 2、创建云杉树预制体 创建新物体命名为CropTreeBlueSpruce&#xff0c;并且添加Box Collider 2D和Crop组件。 在CropTreeBlueSpruce下创建子物体命名为CropSprite&#xff0c;添加3个组件…

【C#】消息队列的使用

在C#中使用消息队列&#xff0c;通常是指使用微软的Message Queuing (MSMQ)技术。MSMQ提供了一种异步通信协议&#xff0c;允许应用程序通过暂时存储要发送到目的地的消息来相互通信。 安装MSMQ 首先&#xff0c;确保你的开发机器和部署服务器上都安装了MSMQ。可以通过“控制…

IP-guard发布新版本4.87.2241.0

IP-guard发布新版本4.87.2241.0 新版本下载地址: https://www.tec-development.com/down/IPguard/Release/V4/IPguard4.87.2241.0.zip?s=901D45ADB22CBBFE5C612DC40AFD6BFB1551A9CD54EF418D5E86BBD256813867 新版本升级地址:

【Linux 服务器磁盘映像备份与恢复实战指南】虚拟机备份,物理机上云都可以用这套方案!

Linux 服务器磁盘映像备份与恢复实战指南 背景 在服务器运维中&#xff0c;磁盘健康度下降可能导致数据丢失风险&#xff0c;特别是在未配置 RAID 的情况下。针对这种情况&#xff0c;备份磁盘数据并恢复到新设备是确保数据安全的关键。本文记录了使用 dd 命令通过 NFS 实现全…