ES2015 Symbol数据类型

华为OD机试真题 C 实现【水库蓄水问题】【2022.11 Q4 新题】 给定一个长度为 n 的整数数组height。数组的元素表示山的高度,选择两个元素作为水库的边界,求蓄水量的最大值并输出蓄水量最大时的边界下标(蓄水量相同时输出下标较近的)。 阅读详情

对象的属性名同名的问题

在 ECMAScript2015 之前对象的属性名都是字符串类型,而字符串是有可能会重复的,那如果重复的话就会产生冲突。比如创建一个用来数据缓存的对象,约定这个对象是全局共享的,然后通过注释的方式模拟不同的 JavaScript 文件使用这个数据缓存对象的情况。

比如在 shared.js 文件中创建这个数据缓存对象,如下代码所示:

const cache = {}

然后在 a.js 文件当中向数据缓存对象添加缓存数据,如下代码所示:

cache['foo'] = Math.random()

这里主要关注对象的属性名,也就是键的问题。然后在 b.js 文件当中再次向数据缓存对象添加缓存数据,如下代码所示:

cache['foo'] = '123'

这里很可能不知道这个缓存数据对象已经存在相同名称的键,也去使用相同名称作为键存放另外一个数据,这样就会产生冲突。

现如今会大量使用第三方模块,很多时候都会需要去扩展第三方模块中提供的一些对象,而此时是不知道这个对象当中是否会存在某一个指定的键,如果冒冒然地去扩展就有可能会产生冲突的问题。

以前解决这种问题的方式就是人为约定,比如这里约定在 a.js 文件放入的缓存键都以 a_ 开头,而 b.js 文件当中都以 b_ 开头。如下代码所示:

/* a.js */
cache['a_foo'] = Math.random()

/* b.js */
cache['b_foo'] = '123'

但是约定的方式只是规避了问题,并不是彻底地解决了这个问题。在这个过程当中如果有人不遵守这个约定的话,这个问题仍然存在。

Symbol 数据类型

ECMAScript2015 为了解决这样的问题新增了一个全新的数据类型叫 Symbol,译为符号,它的作用就是表示一个独一无二的值。

可以通过 Symbol() 函数创建一个 Symbol 类型的数据,如下代码所示:

const s = Symbol()
console.log(s)

上述代码的运行结果如下:

Symbol()

而且使用 typeof 运算符判断这个数据类型的结果就是 Symbol,这也就表示 Symbol 是一个全新的类型。如下代码所示:

console.log(typeof s)

Symbol 类型的最大特点就是独一无二,也就是说,通过 Symbol() 函数创建的每一个值都是唯一的。如下代码所示:

console.log(Symbol() === Symbol())

上述代码的运行结果如下:

false

考虑到在开发过程中的调试,Symbol() 函数允许传递一个字符串作为这个值的描述文本。这样的话,对于多次使用 Symbol 的情况就可以在控制台区分当前使用的到底是哪一个 Symbol 数据。如下代码所示:

console.log(Symbol('foo'))
console.log(Symbol('bar'))
console.log(Symbol('baz'))

上述代码的运行结果如下:

Symbol(foo)
Symbol(bar)
Symbol(baz)

而且从 ECMAScript2015 开始,对象就可以直接使用 Symbol 类型的值作为属性名。也就是说,现在对象的属性名可以是两种类型,分别是 String 和 Symbol。如下代码所示:

const obj = {}
obj[Symbol()] = '123'
obj[Symbol()] = '456'

console.log(obj)

上述代码的运行结果如下:

{ [Symbol()]: '123', [Symbol()]: '456' }

从打印的结果可以看到,因为 Symbol 值都是独一无二的,所以这里就不用担心可能会产生冲突的问题了。这里也可以使用计算属性名的方式直接在对象字面量当中使用 Symbol 作为属性名。如下代码所示:

const obj = {
  [Symbol()]: 123
}

模拟实现对象的私有成员

另外,Symbol 除了可以避免对象的属性名重复产生的问题,还可以借助这种类型的特点模拟实现对象的私有成员。如下代码所示:

/* a.js */
const name = Symbol()
const person = {
  [name]: '前端课湛',
  say() {
    console.log(this[name])
  }
}

/* b.js */
console.log(person[Symbol()])
person.say()

如果在 a.js 文件中创建一个对象,使用 Symbol 作为其中一个属性名的话,那在外部(b.js 文件)是无法访问到以 Symbol 作为属性名的属性或方法的。

上述代码的运行结果如下:

undefined
前端课湛

Symbol 类型最主要的作用就是为对象添加独一无二的属性名。

Symbol 的唯一性

Symbol 在使用上还有一些值得注意的地方。首先是 Symbol 的唯一性,每次通过 Symbol 创建的值一定是唯一的值,不管传入的文本描述是不是相同的。如下代码所示:

console.log(
  Symbol() === Symbol(),
  Symbol('foo') === Symbol('foo')
)

上述代码的运行结果如下:

false false

如果需要在全局复用一个相同的 Symbol 值,可以使用全局变量的方式去实现,或者使用 Symbol 提供的一个 for() 静态方法去实现。如下代码所示:

const s1 = Symbol.for('foo')
const s2 = Symbol.for('foo')
console.log(s1 === s2)

上述代码的运行结果如下:

true

for() 方法内部维护了一个全局的注册表,为字符串和 Symbol 值提供了一个一一对应的关系。需要注意的是,for() 方法内部维护的是字符串和 Symbol 之间的关系。也就是说,如果传入的不是字符串,for() 方法内部会自动把它转换成字符串。如下代码所示:

console.log(Symbol.for(true) === Symbol.for('true'))

上述代码的运行结果如下:

true

从上述打印结果可以看到,for() 方法内部将 Boolean 类型的 true 转换成了 String 类型的 true,所以两者比较的结果为 true。

Symbol 的这一特点尤其需要注意。

Symbol 提供的常量

而且,在 Symbol 类型还提供了很多内置的 Symbol 常量,用来作为内部方法的标识。这些标识符可以让自定义对象去实现一些 JavaScript 当中内置的接口。如下代码所示:

const obj = {}
console.log(obj.toString())

上述代码的运行结果如下:

[object Object]

上述打印结果被称为 obj 对象的 toString 标签。如果想要自定义这个对象的 toString 标签,就可以在这个对象当中添加一个特殊的成员来进行标识。如下代码所示:

const obj = {
  [Symbol.toStringTag]: 'XObject'
}
console.log(obj.toString())

上述代码的运行结果如下:

[object XObject]

Symbol 值作为对象属性名的特性

最后,使用 Symbol 值作为对象的属性名,通过 for...in 循环是无法获取的。如下代码所示:

const obj = {
  [Symbol()]: 'Symbol value',
  foo: 'normal value'
}

for (let key in obj) {
  console.log(key)
}

上述代码的运行结果如下:

foo

而且,通过 Object.keys() 方法同样无法获取使用 Symbol 值作为对象的属性名。再有就是如果通过 JSON.stringify() 序列化对象为一个 JSON 字符串的话,使用 Symbol 值作为对象的属性名也会被忽略掉。

总之,这些特性都使得 Symbol 类型的属性特别适合作为对象的私有属性。当然,想要获取这种类型的属性名也不是没有办法的,可以使用 Object.getOwnPropertySymbols() 方法。如下代码所示:

console.log(Object.getOwnPropertySymbols(obj))

上述代码的运行结果如下:

[ Symbol() ]

Object.getOwnPropertySymbols() 方法的作用类似于 Object.keys() 方法,所不同的是 Object.keys() 方法只能获取字符串作为属性名的属性,而 Object.getOwnPropertySymbols() 方法获取的都是 Symbol 作为属性名的属性。

android 蓝牙通讯demo android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。 立即下载

相关推荐

使用VS Code创建第一个Flutter工程

你可以使用任意文本编辑器结合命令行工具来开发Flutter应用。然而,我们推荐使用本文介绍的编辑器插件以获取更好的开发体验。这些插件提供了代码补全、代码高亮、widget辅助编辑等功能,以及为项目的运行和调试提供支持。推荐的开发工具有VS Code、Android Studio、IntelliJ。本文将重点介绍如何使用VS Code进行Flutter应用开发。

2501_91373349的博客 2126

es6(es2015)中的promise , symbol

promise对象,解决回调地狱问题 **基本写法,创建promise对象** let p = new Promise((resolve,reject)=>{ resolve("lala"); //方法 //reject(); //方法 }); p.then((data)=>{ console.log(data) }).catch((err)=>{ console.log(err) }) Promise.all

parkvisitor的博客 341

银河麒麟V10 SP3下NFS客户端挂载失败?5个常见问题排查与修复

本文针对银河麒麟V10 SP3系统中NFS客户端挂载失败的常见问题,提供了5个实战排查方案。从基础服务状态检查到防火墙配置、版本兼容性、/etc/fstab设置及权限映射,详细解析了问题根源与解决方案,帮助用户快速恢复NFS文件共享功能。

weixin_42525005的博客 361

前端进阶攻略之ES6中的Symbol

ES6中的Symbol 一.Symbol基本概念 Symbol是ES6中引入得一种新型的数据类型(符号类型),它是 JavaScript 语言的第七种数据类型,前六种是:undefined、null、布尔值Boolean、字符串String、数值Number、对象Object` 1.1.引入Symbol的好处 为解决属性名冲突问题而生 ES5 中方法和属性的命名: 以前,我们给一个对象下的方法或者属性命名的时候,可能会与该对象原有的方法或者属性产生冲突,这样的场景想必大家也很熟悉,我们常用到的解决

zm17671443092的博客 3066

ABB RobotStudio 和 S7-PLCSIM Advanced V5.0 搭建虚拟通信环境,实现 PLC 对机器人布尔量、数字量和模拟量的控制。

本教程详细介绍了如何利用ABB RobotStudio和S7-PLCSIM Advanced V5.0搭建虚拟通信环境,实现PLC对机器人的布尔量、数字量和模拟量控制。主要内容包括:在TIA Portal V20中配置PLC项目并编写通信程序;通过S7-PLCSIM Advanced创建虚拟PLC运行环境;在RobotStudio中设置机器人PROFINET通信;以及建立虚拟网络连接并进行功能测试。该方案适用于工业自动化虚拟调试,可显著降低现场调试风险。操作需注意软件版本兼容性、网络配置及信号映射准确性,最

CHUXUEZHE8210的博客 2515

【KDD2024】ShapeFormer:用于多元时间序列分类的Shapelet Transformer

多元时间序列分类(MTSC)因其在现实世界中的广泛应用而吸引了大量研究关注。最近,Transformer在MTSC中取得了先进的性能。然而,

m0_52597077的博客 4740

【ES】笔记-Symbol详解

Symbol。

德仔 963

llama.cpp量化模型在MTT显卡上的性能对比:S80/S3000/S4000实测数据

本文基于摩尔线程MTT S80、S3000和S4000三款显卡,对llama.cpp量化模型进行了深度性能实测。报告详细对比了不同量化精度(如Q4_K_M、Q6_K)在Llama 3.2 1B和Qwen 2.5 7B模型上的推理速度、显存占用、功耗及温度表现,为开发者根据硬件选择最优模型配置与参数调优提供了关键数据参考和实战指南。

week9的博客 350

前端知识复习

2.如果没有,才会沿着原型链,层层向上搜索,直到找到名字的属性 3.如果找到最后原型链的末尾,即最后的原型为null,那就是没有找到该属性。我们使用这种方式实现网络请求时,如果请求内部又包含请求,以此循环,就会出现回调地狱,这也是一个诟病,后来才催生了更加优雅的请求方式。bind 也能改变对象的执行上下文,它与 call 和 apply 不同的是,返回值是一个函数,并且需要稍后再调用一下,才会执行。是函数对象独有的属性,它是在函数被创建时自动添加的,指向一个对象,该对象就是函数的原型。

m0_57057282的博客 1169

基于 YOLOv8 的自动驾驶车辆障碍物检测与避障路径规划

本文探讨基于YOLOv8的自动驾驶车辆障碍物检测与避障路径规划系统。在感知层面,采用YOLOv8模型实现多类别障碍物识别,结合单目视觉距离估计和ByteTrack多目标跟踪算法,完成障碍物的稳定检测与运动状态估计。在路径规划层面,设计分层规划架构,融合全局路径规划与局部避障算法,重点实现Frenet坐标系下的采样优化算法和基于模型预测控制的实时避障轨迹生成。通过完整的代码实现与仿真实验,验证系统在复杂交通场景下的有效性与实时性,为自动驾驶开发者提供从理论到实践的完整技术参考。 关键词:YOLOv8;自动驾驶

huanghm88的专栏 248

基于YOLOv8的MVTec AD缺陷检测系统设计与实现

速度快,精度高;支持 anchor-free 架构;支持实例分割和图像分类;模块化代码,易于部署与改进;完美兼容 ONNX、TensorRT 等推理框架;官方支持多平台训练和推理(CPU/GPU)。YOLOv8 是工业视觉检测落地非常理想的选择。MVTec AD(Anomaly Detection)数据集包括15类工业对象,每个对象包括多个子类缺陷(例如 “scratch”, “crack”, “hole”)及正常图像。类别缺陷子类bottlecablecapsule。

YOLO 931

作为前端的你 Symbol 还没用过,有点" Low"了!

大厂技术高级前端Node进阶点击上方程序员成长指北,关注公众号回复1,加入高级Node交流群本文你能学到?看完脑图,正文从这里开始。Symbol 是什么Symbol 是一种基本数据类型。Symbol() 函数返回 symbol类型的值,注意!注意!注意! 通过 Symbol创建返回的 symbol 值都是唯一的。一个symbol 值能作为对象属性的标识符;这是该数据类型仅有的目的。创建 ...

程序员成长指北 450

如何在 FPGA 中做数学运算

FPGA 非常适合进行数学运算,但是需要一点技巧,所以我们今天就看看如何在 FPGA 中进行简单和复杂的数学运算。介绍由于FPGA可以对算法进行并行化,所以FPGA 非常适合在可编程逻辑中实现数学运算。我们可以在 FPGA 中使用数学来实现信号处理、仪器仪表、图像处理和控制算法等一系列应用。这意味着 FPGA 可用于从自动驾驶汽车图像处理到雷达和飞机飞行控制系统的一系列应用。因为 FPGA 寄存器...

OpenFPGA的博客 2917

ES2015 Symbol 一种全新的原始数据类型

一、Symbol 的基本使用 在ES2015之前,对象的属性名都是字符串,而字符串有可能会重复,重复的话有可能会有冲突。 看一个例子,比如有3个js文件 // share.js========= const cache = {} // a.js========= cache['foo'] = '123' // b.js========= cache['foo'] = Math.random() console.log(catch) 现在我们大量使用第三方库,很多时候需要自己去扩展。如果出现属性重复怎么办

路遇惊喜 333

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

es6 symbol

Symbol 1.Symbol是ES2015新增的基本数据类型 2.使用Symbol()函数来定义Symbol类型,并可以通过typeof检测并返回Symbol类型 3.用Symbol定义的类型是唯一的,即定义的两个相同的Symbol比较返回值也是false 例如: let s = Symbol(); console.log(s); let s2 = Symbol("name") console.log(s2) console.log(typeof s2) let s3 = Symbol("age") co

weixin_47224517的博客 95

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

ES5和ES6的区别是什么?

es6中的symbol是一种新的原始数据类型,用于表示独一无二的值,最大的用法是用来定义对象的唯一属性名;它可以当作普通字符串使用,也可以用来定义多行字符串,或者在字符串中嵌入变量。4、箭头函数中 this 的指向不同:在普通函数中,this 总是指向调用它的对象,如果用作构造函数,它指向创建的对象实例。ES6中引入了Promise,它提供了一种更好的异步编程方式,用于处理异步操作。2、 箭头函数全都是匿名函数:普通函数可以有匿名函数,也可以有具名函数。1、外形不同:箭头函数使用箭头定义,普通函数中没有。

Mxy18851251178的博客 961

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

ES6和ES5的区别

总之,ES6是ES5的一个重要升级版本,添加了许多新的特性和功能,使得JavaScript编程更加容易,代码更加模块化、清晰和可读性强。1. 新的语法特性:ES6添加了let和const关键字、箭头函数、模板字面量、解构赋值、默认参数、rest参数、扩展操作符和类等。5. 变量作用域:ES6中引入了块级作用域,let和const关键字只在其声明的块级作用域内有效。3. 模块化:ES6引入了模块化,使得JavaScript代码更加易于维护和重用。7. 类:ES6中引入了类,让面向对象编程更加易于理解和实现。

dxn16638400024的博客 1114

15.Symbol类型

15_Symbol类型

xiaoxiannvh的博客 51

js[es6相较于es5常用内容整理]

es6又称es2015,这个是es中的一个大版本的改变,因此相较于es5来说有了许多的变化。而后续的es6以上的版本通常是以年份来叫如es2015(es6)、es2016(es7)、es2017…

墨水白云的博客 410

学习六、ES2015的新特性简要

新特性有四大类: 1、解决原有语法上的一些问题或不足 2、对原有语法进行增强 3、全新的对象,全新的方法,全新的功能 4、全新的数据类型和数据结构 一、Let,Const和块级作用域 在ES2015之前,只有全局作用域和函数作用域,现在可以声明Let和Const它们都属于块级作用域中的定义变量,并且不会声明提前。 for (let i = 0; i < 3; i++) { let i = 'foo' console.log(i) } 二、数组和对象的解构 我们可以这样.

qq_40289624的博客 377

es6基础

1

Shirley_0513的博客 429

数组常用方法(es6)

16.June workTwelve 记录 | 郭晴 今日工作内容 1. 今天郝老师主要接着昨天讲了es2015新增的数据类型symbol以及拓展出来的别的问题,还有es2015默认参数,gennerater迭代器,peomise封装以及async,await。那具体来说一下吧,首先symbol它是es2015新增的数据类型,也是新增的基本数据类型,那么在此之前基本数据类型是五种。随着这个问题拓展的问题呢,可能是怎么去识别数据类型,那么分别为typeof,insdanceof,和object. prot

weixin_47038177的博客 238

【ES6】关于es6各种新语法

b站:深入解读ES6系列 ES6怎么来的 ECMAScript 和 JavaScript ECMA 是标准,JS 是实现 ECMAScript 简称 ECMA 或 ES 历史版本 1996, ES1.0 Netscape 将 JS 提交给 ECMA 组织,ES 正式出现 1999, ES3.0 被广泛支持 2011, ES5.1 成为 ISO 国际标准 2015, ES6.0 正式发布 ES6兼容性 ES6(ES2015) 支持的环境 IE10+, Chrome, FireFox, 移动端, NodeJ

庭落 736

ECMAScript新特性

JavaScript是ECMAScript的扩展语言,ECMAScript只提供了基础的语法。 在浏览器环境中:js = Bom + Dom + ECMAScript 在浏览器环境中:js = fs + net+ ECMAScript +etc. JavaScript语言本身指的就是ECMAScript。 ES2015新特性: 解决原有语法上的一些问题或者不足(例如let,const所提供的块级作用域) 对原有语法进行增强(例如解构,展开,模板字符串) 全新的对象,全新的方法,全新的功能(例如promi

weixin_43132396的博客 252

ES6基础

一、let和const ES2015(ES6) 新增加了两个重要的 JavaScript 关键字: let 和 const。 let用法 let命令,用来声明变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。 不存在变量提升 不允许重复声明 for 循环计数器很适合用 let 暂时性死区 //for循环计数器 for (var i = 0; i < 10; i++) { //i为全局变量 setTimeout(function

yueyuezaina的博客 241

JavaScript12—ES6基础简介

ES6 历史 ECMAScript 和 JavaScript 到底是什么关系? 96年网景公司提交ECMA标准1.0 因此,现有JS,后有ECMA标准 ES6 与 ECMAScript 2015 的关系 先提出了ECMAScript 6定为ECMA5.1的下一个标准 实际ES6出了很多版本,最后在2015年确定了ECMAScript 2015 因此ES6是泛指 严格模式 模块化开发,自动严格模式 “use strict” -变量必须声明后再使用 - 函数的参数不能有同名属性,否则报错(str.len

Iris_20的博客 313
上一篇: ES2015 Set与Map数据结构
下一篇: CSS中的颜色其实很简单,不信你看
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值