ES6 Symbol 数据结构

1. Symbol概念以及引入原因

ES6 引入了的一种新的原始数据类型Symbol,表示独一无二的值。它是 JavaScript 语言的第七种数据类型,前六种是:undefined、null、布尔值(Boolean)、字符串(String)、数值(Number)、对象(Object)。

重点

  • Symbol作用:保证每个对象属性的名字都是独一无二的
  • Symbol 可以接收字符串作为参数
  • Symbol参数(参数为对象会调用toString()作为key;参数相同值也不同;没有参数值也不同)
  • Symbol 值不能与其他类型的值进行运算,会报错。
  • Symbol 值可以显式转为字符串和布尔值,不能转为Number数值。
  • Symbol.iterator属性是一种特殊的key。指向该对象的默认遍历器方法,凡是具有Symbol.iterator属性的对象,都可以使用for...of进行遍历

2.Symbol作用:保证每个对象属性的名字都是独一无二的

问题:对象直接设置key为对象,会将对象调用toString()方法转为[Object,Object],第二个值就覆盖第一个值了

        let obj1 = {a:1}let obj2 = {a:2}let obj = {};// 想要将obj的key设置为obj1的值obj[{a:1}] = 1obj[obj1] = 1;obj[obj2] = 2;// 发现只有一个值,且返回的obj键转成了[object Object],值为2,1被覆盖console.log(obj);// [object Object] 2 

使用Symbol进行定义后,发现就不会被覆盖: 

        let obj1 = Symbol({a:1})let obj2 = Symbol({a:2})let obj = {};obj[obj1] = 1;obj[obj2] = 2;console.log(obj);

3.Symbol 可以接收字符串作为参数

Symbol函数可以接受一个字符串作为参数,表示对 Symbol 实例的描述,主要是为了在控制台显示,或者转为字符串时,比较容易区分。

如下:即使字符串相同,s1和s2也不是一个

        let s1 = Symbol('foo');let s2 = Symbol('foo');console.log(s1 === s2); //false

 3.Symbol参数(参数为对象会调用toString()作为key;参数相同值也不同;没有参数值也不同)

注意1: Symbol 的参数是一个对象,就会调用该对象的toString方法,将其转为字符串,然后才生成一个 Symbol 值。

注意2:Symbol函数的参数只是表示对当前 Symbol 值的描述,因此相同参数的Symbol函数的返回值是不相等的。

注意3:Symbol函数的参数没有值也不同

        // 没有参数的情况let s1 = Symbol();let s2 = Symbol();s1 === s2 // false// 有参数的情况let s1 = Symbol('foo');let s2 = Symbol('foo');s1 === s2 // false

4.Symbol 值不能与其他类型的值进行运算,会报错。

        let sym = Symbol('My symbol');console.log( "your symbol is " + sym);//Uncaught TypeError: Cannot convert a Symbol value to a stringlet num = Symbol(1);console.log(num+1);Uncaught TypeError: Cannot convert a Symbol value to a string

5.Symbol 值可以显式转为字符串。

        let sym = Symbol('My symbol');console.log(String(sym));//Symbol(My symbol)console.log(sym.toString());//Symbol(My symbol)

6.Symbol 值也可以转为布尔值,但是不能转为数值。

        let sym2 = Symbol();console.log(Boolean(sym2));//trueconsole.log(!sym2);//falseconsole.log(Number(sym2));//Uncaught TypeError: Cannot convert a Symbol value to a number

7.Symbol.iterator属性

  • 可以看作一种特殊的key
  • 对象的Symbol.iterator属性,指向该对象的默认遍历器方法。
  • 对象进行for...of循环时,会调用Symbol.iterator方法,返回该对象的默认遍历器。 
  • 凡是具有Symbol.iterator属性的对象,都可以使用for...of进行遍历
  • 如果想让其可以通过for...of进行遍历,就使用Symbol.iterator给其添加一个可遍历的属性

8. Symbol中Object.getOwnPropertySymbols方法获取指定对象的所有 Symbol 属性名。

  • Symbol类型时不可枚举的,即属性上有Symbol时,遍历不出来;如果想要获取上面的Symbol属性,就需要使用Object.getOwnPropertySymbols方法。
  • Object.getOwnPropertySymbols方法,可以获取指定对象的所有 Symbol 属性名。
  • Object.getOwnPropertySymbols方法返回一个数组,成员是当前对象的所有用作属性名的 Symbol 值。
        const obj = {};let a = Symbol('a');let b = Symbol('b');obj[a] = 'Hello';obj[b] = 'World';const objectSymbols = Object.getOwnPropertySymbols(obj);console.log(objectSymbols); //[Symbol(a), Symbol(b)

9.Symbol的实际使用:私有属性;常量枚举

9.1作为常量进行枚举

常量枚举 js没有枚举类型的

        // 常量枚举 js没有枚举类型的// 产生一个问题 1 2 不能重复  重复的话判断就会出错// symbol 哪怕你写重复了也没问题// const CODE_ONE = 1;// const CODE_TWO = 2;const CODE_ONE = Symbol(1)const CODE_TWO = Symbol(2)console.log(CODE_ONE === CODE_TWO);

9.2作为私有属性:对象进行遍历时,不会遍历具有Symbol类型的数据

对象进行遍历时,不会遍历具有Symbol类型的数据

        // 私有属性let private = Symbol('private')var obj = {_name: '张三',[private]: '私有的属性',say: function () {console.log(this[private])}}console.log(Object.keys(obj))//['_name', 'say']

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

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

相关文章

Stanford CS224N - word2vec

最近在听Stanford放出来的Stanford CS224N NLP with Deep Learning这门课,弥补一下之前nlp这块基础知识的一些不清楚的地方,顺便巩固一下基础知识😁 关于word2vec: 1.为什么要把单词表示成向量 一开始人们造了一个类似于词典表…

Squeeze-and-Attention Networks for Semantic Segmentation

0.摘要 最近,将注意力机制整合到分割网络中可以通过更重视提供更多信息的特征来提高它们的表征能力。然而,这些注意力机制忽视了语义分割的一个隐含子任务,并受到卷积核的网格结构的限制。在本文中,我们提出了一种新颖的squeeze-a…

Linux不间断会话服务

9.2.3远程传输命令 家里有2台电脑,一台是ubuntu虚拟机,另一台是rhel8虚拟机器,两台虚拟机都是通过桥接的方式(桥接方式就是虚拟机直接和路由器连接)上网。然后现在用ubuntu来使用sshd服务登录rhel8系统。 用ip addr命…

Arcgis聚合工具——实现简单的升尺度

找到Aggregate工具 按如下设置进行操作 注意:如有需要对应的低分辨率影像,必须点开右下角环境Environments选项,进行栅格的捕捉选项设置,以防止升尺度后的影像与需对应的低分辨率影像的栅格单元存在偏移。 点击OK,即可…

算法--排序算法效率比较

《算法设计与分析》课程实验报告 ( 实验一) 实验名称:排序算法效率比较 实验地点: 所使用的开发工具及环境: PC机,DEV 一、实验目的: 比较至少 4 种排序(从小到大排&#xff09…

大数据Flink(九十七):EXPLAIN、USE和SHOW 子句

文章目录 EXPLAIN、USE和SHOW 子句 一、EXPLAIN 子句 二、USE 子句

Ruby和面向对象技术

Ruby和许多极为流行的编程语言都是面向对象的。多数的面向对象编程语言,每个对象都是一个样例或者既定类的实例以及独立对象的行为。 一、创建一个通用对象 创建一个通用对象 obj Object.new定义通用对象的行为 def obj.talk puts "I am an object"p…

VMware——VMware17安装WindowServer2012R2环境(图解版)

目录 一、WindowServer2012R2镜像百度云下载二、安装 一、WindowServer2012R2镜像百度云下载 下载链接:https://pan.baidu.com/s/1TWnSRJTk0ruGNn4YinzIgA 提取码:e7u0 二、安装 打开虚拟机,点击【创建新的虚拟机】,如下图&…

直接插入排序

排序——先写单个——再衍生到整体 单个插入排序——在插入前数组里面的数是有序的,然后来了一个数据,就要用这个数组从后往前和这个数比较, 整体的话就是,end从0开始,循环n-1次 void TnsertSort(int* a,int n) {in…

SpringCloud: sentinel链路限流

一、配置文件要增加 spring.cloud.sentinel.webContextUnify: false二、在要限流的业务方法上使用SentinelResource注解 package cn.edu.tju.service;import com.alibaba.csp.sentinel.annotation.SentinelResource; import com.alibaba.csp.sentinel.slots.block.BlockExcept…

【Python】文件操作

一、文件的编码 思考:计算机只能识别:0和1,那么我们丰富的文本文件是如何被计算机识别,并存储在硬盘中呢? 答案:使用编码技术( 密码本)将内容翻译成0和1存入 编码技术即:翻译的规则,记录了如何将内容翻译成二进制,以及如何将二…

nginx平滑升级添加echo模块、localtion配置、rewrite配置

nginx平滑升级添加echo模块、location配置、rewrite配置 文章目录 nginx平滑升级添加echo模块、location配置、rewrite配置1.环境说明:2.nginx平滑升级原理:3.平滑升级nginx,并添加echo模块3.1.查看当前nginx版本以及老版本编译参数信息3.2.下…

【MyBatis】MyBatis日志信息配置

目录 什么是MyBatis相关的日志? 标准日志信息配置: 配置logback日志信息: 什么是MyBatis相关的日志? 首先什么叫做与MyBatis相关的日志呢?就是我们在执行sql语句的时候,如果没有MyBatis相关的日志&…

TX Text Control.NET 32.0 For WPF

TX Text Control 支持VISUAL STUDIO 2022、.NET 5 和 .NET 6 支持 .NET WPF 应用程序的文档处理 将文档编辑、创建和 PDF 生成添加到您的 WPF 应用程序中。 视窗用户界面 功能齐全的文档编辑器 TX Text Control 是一款完全可编程的丰富编辑控件,它在专为 Visual Stu…

基于java的校园论坛系统,ssm+jsp,Mysql数据库,前台用户+后台管理,完美运行,有一万多字论文

目录 演示视频 基本介绍 论文目录 功能架构 系统截图 演示视频 基本介绍 基于java的校园论坛系统,Mysql数据库,系统整体采用ssmjsp设计,前台用户后台管理,完美运行,有一万多字论文。 用户功能: 1.系统…

DVWA-impossible代码审计

文章目录 DVWA靶场—impossible代码审计1.暴力破解(Brute Force)1.1 代码审计1.2 总结 2.命令注入(Command Injection)2.1 代码审计2.2 总结 3.跨站请求伪造(CSRF)3.1 代码审计3.2 总结 4.文件包含漏洞&…

二叉搜索树的详解及Map和Set的介绍

目录 1.二叉搜索树 1.1二叉搜索树的介绍 1.2.二叉搜索树的实现 1.2.1二叉搜索树的创建 1.2.2查找关键字 1.2.3插入 1.2.4删除 1.3二叉搜索树的性能分析 2.Map Map官方文档 2.1Map 的常用方法说明 2.2关于Map.Entry的说明,> 2.3注意事项 2.4reeMap和HashMap的区别 …

E054-web安全应用-Brute force暴力破解进阶

课程名称: E054-web安全应用-Brute force暴力破解进阶 课程分类: web安全应用 实验等级: 中级 任务场景: 【任务场景】 小王接到磐石公司的邀请,对该公司旗下的网站进行安全检测,经过一番检查发现该网站可能存在弱口令漏洞…

MySql 数据库基础概念,基本简单操作及数据类型介绍

文章目录 数据库基础为什么需要数据库?创建数据库mysql架构SQL语句分类编码集修改数据库属性数据库备份 表的基本操作存在时更新,不存在时插入 数据类型日期类型enum和set 数据库基础 以特定的格式保存文件,叫做数据库,这是狭义上…

【交互式分割】——数据可视化

ritm, 交互式分割 数据可视化 数据包括一张图片 正样本点 负样本点 二分类的mask标签 如何模拟多次点击的迭代过程?