ES6新增 Symbol

js中Symbol的理解与应用 在JavaScript中,Symbol 是一种基本数据类型,它是 ECMAScript 6(ES6)引入的新特性之一。Symbol 主要用于创建具有唯一性的标识符,这些标识符不会与其他任何值冲突。 阅读详情

Symbol的诞生?

Symbol的诞生,也就是Symbol存在的意义
之前我们的对象属性的数据类型都是字符串,没有其他的了。所以会导致属性名重复,导致属性值被覆盖的情况。比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法,在添加的操作就很容易覆盖了原有的方法。所以需要一个独一无二的数据类型来完成这个使命。所以Symbol出来主持大局了。

Symbol的介绍

Symbol是ES6中引入的一种新的基本数据类型,用于表示一个独一无二的值。它是JavaScript中的第七种数据类型,与undefined、null、Number(数值)、String(字符串)、Boolean(布尔值)、Object(对象)并列。

你可以这样创建一个Symbol值:

const a = Symbol();
console.log(a);  //Symbol()

使用Symbol函数可以生成一个Symbol类型的值,但是你不能在调用Symbol时使用new关键字,因为Symbol是基本数据类型,而不是对象。比如下面的写法是错误的:

//报错,Symbol is not a constructor
const a = new Symbol();

1. 唯一性

使用Symbol()创建一个Symbol类型的值并赋值给a变量后,你就得到了一个在内存中独一无二的值。

let a = Symbol('a');
let b = Symbol('a');
console.log(a == b) // fasle

尽管a和b都是使用Symbol()创建出来的,但是它们在内存中看起来却是这样的:

实际上,a变量拿到了内存中某块内存的唯一引用(这里所说的引用,其实就是该内存的地址)。如果不借助a变量,你不可能再得到这个地址。因此:

a !== b;  //a和b持有的是两块内存的引用

const c = a;  //手动把a里保存的地址保存在c变量中
a === c;  //c和a现在指向同一块内存,因为它们保存了同样的地址

这种行为看似难以理解,但其实它与对象遵循相同的规则,如:

var a = {};
var b = {};

a !== b;  //a和b各自被分配了不同的内存,因此它们保存了不同的地址

//借助变量a,变量c拿到了a指向的那个对象的地址,因此两者相等
var c = a;
a === c;

但是对于同为基本数据类型的字符串来说,它不遵循类似的规则。

比如:

var a = "123";
var b = "123";

a === b;  //返回true。两者在常量区引用同一个字符串

我们首先通过变量a在内存中创建了字符串“123”,然后在不借助变量a的情况下,又通过var b = "123"拿到了对“123”这个字符串的引用,两者指向内存中的同一块内存地址。

在这里插入图片描述

因此我们说,a无法确保别的变量无法拿到它保存的地址(前提是不通过a)。但是对于var a = Symbol()这样的语句,a变量内保存的值是唯一的,因为除了借助a变量,你永远无法得到a中保存的值。这也是Symbol的本质。

可能很多人比较奇怪,一个Symbol类型的变量里面到底保存了什么呢?

我们看两行代码:

var a = Symbol();

console.log(a);  //Symbol()

我们试图输出a的值,但js引擎输出了Symbol()。显然它不能说明a的值是字符串,因为:

typeof a === "symbol";

所以说如果你想问js引擎a的值是多少,引擎只会告诉你它是一个Symbol类型的值。也就是说,Symbol真正存储了什么并不重要,重要的是它的值永远不会与别的值相等。Symbol的中文释义为“标志,符号”,一个Symbol类型的变量只是为了标记一块唯一的内存而存在的。也正是因为这样,Symbol类型的值不参与运算。

2、数据类型的修饰

有人会好奇Symbol( 'a')里面的参数a又是怎么回事呢?字符串a表示一种修饰,对你当前创建的Symbol类型的一种修饰,作为区分使用,否则当你创建多个Symbol数据时,容易混淆。

3.与其他数据类型之间的转换

Symbol不能用四则运算进行操作,否则报错。它只能用显示的方式转为字符串和布尔值,即:String(Symbol())/    Boolean(Symbol())

4. 作为对象的属性 

作为对象属性时,要注意用以下三种方式来书写

let msMymbol = Symbol();

// 第一种写法
let a = {};
a{mySymbol} = 'Hello'


// 第二种写法
let a = {
[mySymbol]:'Hello';
}


// 第三种写法
let a = {}
Object.defineProperty(a,mySymbol,{value:'Hello'})

// 以上的都可以得到 a[mySymbol]  // 'hello'

5、Symbol属性的遍历

以上说了对象属性的创建,但是我们要格外的注意,Symbol作为属性名,该属性不会出现在for...in、for...of 循环中,也不会被Object.keys、Object.getOwnPropertyNames()、JSON.ownKeys(),这个方法就可以返回对象所有的属性,也就是字符串属性和Symbol属性。

但该属性并不是私有属性,它可以被专门的Object.getOwnPropertySymbols()方法遍历出来。该方法返回一个数组,包含了当前对象的所有用作属性名的Symbol值:

var s1 = Symbol('a');
var s2 = Symbol('b');

var a = {
    name: "江左梅郎",
    [s1]: 24,
    [s2]: function(){}
}

var s = Object.getOwnPropertySymbols(a); //[Symbol(a), Symbol(b)]
a[s[0]] = 24; //返回的数组元素不是字符串,而是实际的Symbol值,
               //因此可以通过它引用到对象的该属性

因此遍历该方法的返回值即可遍历所有的Symbol属性。

另外,ES6新增的Reflect.ownKeys()方法可以遍历出所有的常规键名和Symbol键名。语法为:

Reflect.ownKeys(a); //["name", Symbol(a), Symbol(b)]

6. Symbol.for(),Symbol.keyFor()

有时,我们希望重新使用同一个 Symbol 值,以上我们都说了 Symbol 数据类型唯一的,所以只要用 Symbol() 方法创建的 Symbol 类型是无法实现的。所以我们都可以用Symbol.for() 这个方法来实现的。

let s1 = Symbol.for('foo');
let s2 = Symbol.for('foo');

console.log(s1 === s2)  // true

注意:这里的Symbol.for() 和 Symbol() 创建的都是Symbol 类型,但是他们的创建机制有所不同,Symbol.for('a') 的创建方式会在创建之前在全局中寻找,有没有用Symbol.for() 的方式,并且key是 ’a' 的字符串创建了 Symbol类型(创建了就会在全局中登记);如果有则不重复创建(已登记的)。然而Symbol('a') 的创建是不会去检索全局的,是直接创建一个新的Symbol类型。这也是用Symbol('a') 创建的两个 Symbol 类型不相等的根本原因。

Symbol.keyFor() 方法返回一个已登记的 Symbol 类型值的 key

let s1 = Symbol.for('foo');
console.log(Symbol.keyFor(s1)) // "foo"

let s2 = Symbol('foo');
console.log(Symbol.keyFor(s2)) // undefined

上面代码中,变量s2 属于未登记的Symbol值,所以返回undefined。也就是Symbol.keyFor() 这个方法,主要服务于Symbol.for() 的。因为Symbol() 方法创建的值用Symbol.keyFor() 永远是undefined

FTPClient使用中,碰到SocketTimeoutException 坑 ftpclient设置soTimeout无效 阅读详情

相关推荐

手把手教你解决Windows 10网络驱动器无法访问问题(附详细排查步骤)

本文详细指导Windows 10用户解决网络驱动器无法访问的常见问题。通过从现象快速定位到系统排查,提供了从检查网络连通性、修复凭据权限到调整高级设置的完整步骤,特别是针对“找不到网络路径”等错误,帮助用户高效恢复对共享资源的访问。

weixin_29233857的博客 517

Js-原始数据类型Symbol符号类型

文章目录概述基本用法使用场景作为对象的属性名注意点Symbol.for()Symbol.keyFor() 概述 Symbol用来表示独一无二的值, 最大的用法就是用来定义对象的唯一属性名。 基本用法 Symbol函数不能用new新建对象, 因为Symbol是原始数据类型, 不是对象。 Symbol可以接收一个值作为参数, 为新创建的Symbol提供描述, 在控制台输出信息时用来区分。 let sy = Symbol('aaa'); console.log(sy); // Symbol(aaa) conso

qq_45458749的博客 886

PD虚拟机安装CentOS7后必做的Parallels Tools配置指南(附常见错误解决)

本文详细指导在Mac的Parallels Desktop虚拟机中安装CentOS 7后如何高效配置Parallels Tools,包括环境准备、镜像挂载、依赖问题解决及性能优化。特别针对常见错误如挂载失败、依赖缺失等提供实用解决方案,帮助用户实现主机与虚拟机间的无缝交互和显示优化。

weixin_29288313的博客 302

ES6 中的 Symbol 是什么?

前言 记得刚找工作那会,几种数据类型是必问题,当时的答案一般都是七种——字符串(String)、数字(Number)、布尔(Boolean)、数组(Array)、对象(Object)、空(Null)、未定义(Undefined),时至今日,某些网络教程上还是这样的分类: 其实,随着 ECMAScript 的发展和完善,在 ES6(2015) 和 ES11(2020) 中,又分别增加了 Symbol 和 BigInt 两种类型,所以,完整的分类应该是下面这样的: 今天,我们就来看看 Symbol 到底是什

编程三昧 492

Python+Seaborn可视化:双因素方差分析结果这样呈现更专业

本文详细介绍了如何利用Python中的Seaborn和statsmodels库,专业地执行并可视化双因素方差分析结果。通过模拟实验数据,演示了从模型构建、统计检验(包括交互作用分析)到诊断验证的全流程。重点展示了如何使用Seaborn绘制交互效应图、组合分布图及热图,将复杂的统计结果转化为直观、富有洞察力的可视化图表,助力科研论文与商业报告的专业呈现。

weixin_29274969的博客 137

科研级YOLOv8 Neck革新:HS-FPN模块赋能,让特征融合更高效且参数量直降100W的实战指南

在文件夹下新建HS_FPN.py,将上述和HS_FPN类的代码写入其中。这一步是为了让YOLOv8的代码架构能识别我们的自定义Neck模块。

FJN110的博客 153

技术分享之Symbol(es6新增基本数据类型)

js包括两种数据类型 1.基本数据类型 2.引用数据类型 基本数据类型:String(字符串) Number(数字) Boolean(布尔) null undefined 引用数据类型:Array(数组) object(对象) date(日期)等 es6新增了一种基本数据类型 **Symbol类型(symbol汉语意思:符号; 象征; 标志; 记号;)**它是一种类似字符串的基本数据类型。 let...

时清云的博客 481

复旦微实现串口在线升级BOOT.BIN

将该 demo 生成的 app(升级用)和 fsbl、最简化 bit 文件(可选)打包成 BOOT.BIN,作为 golden image 烧写在 qspi flash 偏移 0 地址开始的位置,其中最简化 bit 文件为在线升级功能提供必要的物理通道(如果不需要,可以不打包该文件),golden image 一旦发布基本不需要进行升级,由该 golden image 负责和上位机进行通信交互,完成业务 app、业务 bit 文件、uboot 以及操作系统 image 等文件在线升级,在qspi flash

wangjie36的博客 3174

Symbol类型的注意点?

一、Symbol函数前不能使用new,否则会报错 let s = new Symbol('ss') console.log(s) //TypeError: Symbol is not a constructor 二、Symbol函数可以接受一个字符串作为参数,表示对Symbol实例的描述,主要是为了在控制台显示,或者转化为字符串时,比较容易区分。 三、Symbol作为属性,该属性不能出现在for…in,for…of循环中,也不会被Object.keys(),Object.getOwnPropertyNam

weixin_47450807的博客 1027

RT-DETR改进策略【注意力机制篇】| 2024 PPA 并行补丁感知注意模块,提高小目标关注度

本文记录的是利用改进检测精度,详细说明了优化原因,注意事项等。原论文在红外小目标检测任务中,小目标在多次下采样操作中容易丢失关键信息。通过替代编码器和解码器基本组件中的传统卷积操作,更好地保留小目标的重要信息。HCF-Net: Hierarchical Context Fusion Network for Infrared Small Object Detection采用多分支特征提取策略,通过不同分支提取不同尺度和层次的特征。利用局部、全局和串行卷积分支,对输入特征张量进行处理。通过控制 patch si

Limiiiing的博客 1648

Qt实现思维导图功能1『核心树』

利用Qt的QGraphicsView框架实现思维导图功能 百度网盘体验地址: 链接:https://pan.baidu.com/s/15x9F48agCDOQbsyH3VwVXA 提取码:8svh 注:UI风格参考博主:前行中的小猪,博文地址:https://blog.youkuaiyun.com/GoForwardToStep/article/details/124692790?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_u

浮生流年的博客 6163

浅谈ES6新增类型Symbol

1、Symbol概述 JavaScript基本数据类型有6种:Undefined、Null、Boolean、String、Number、Object。 ES6新增了一种数据类型:Symbol,表示独一无二的值,Symbol最大的用途是用来定义对象的唯一属性名。 ES5的对象属性名都是字符串,容易造成属性名的冲突。如使用了一个其他人提供的对象,但又想为其添加新的方法(mixin模式),那么新方

筱葭的博客 4294

2026华为OD机试(Python)真题【E卷+A卷+B卷+C卷+D卷】目录+在线OJ

华为OD机试真题题库【E卷+A卷+B卷+C卷+D卷】目录,Python实现。

MISAYAONE的博客 29万+

ES6新增数据类型 Symbol

       Symbol是ES6新增的一种数据类型,根据单词的语义化我们就可以得知此单词表示独特的,独一无二的。它是继undefined、null、布尔值(Boolean)、字符串(String)、数值(Number)、对象(Object)之后的第七种属于js语言的数据类型。     &...

huangfuyk.的博客 4034

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

es6中新增Symbol

Symbol: es6中新增的一个基本数据类型 var s=Symbol(); typeof s ==>返回值为Symbol 用来设置一个独一无二的值,类似于设置id 只是一个普通方法,不是构造函数 1.创建变量 var s=Symbol();//空 var s=Symbol(“hello”);-----//只是描述信息,字符串格式 2.应用 1)两个symbol比较永远返回false 2)声明常量 const a=Symbol(); 3)设置给对象的属性名 var age=Symbol(); var

weixin_44359232的博客 291

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

ES6中新增的数据类型 Symbol

在ES6之前,基本数据类型有五种 Undefined、Null、String、Number、Boolean;引用数据类型有一种 Object。但在ES6之后,新增了一种基本数据类型 Symbol。 文章目录Symbol是什么?可以做什么? Symbol是什么? Symbol用来表示独一无二的值,创建一个符号。 console.log(Symbol()) console.log(typeof Sym...

王飞 2148

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

ES6 新增的类型Symbol

Symbol 是ES6中新增的一种数据类型,是唯一的标识符,可以作为对象的唯一属性名; Symbol 可以代替一个常量,指的常量的值唯一; Symbol 的特点: 唯一性:即使两个变量类型,值都一样,也不相等; let id1 = Symbol('id'); let id2 = Symbol('id'); console.log(id1 == id2); //false 隐藏性: 用 [] 标识的symbol类型作为对象的属性的时候,不能被for in 访问 let id = Symbol("i

weixin_44684357的博客 252

ES6 新增数据类型 Symbol

Symbol是ES6新增的数据类型,通常叫 符号 创建: Symbol(符号名) 设计初衷: 为对象设置私有属性(只能在对象内部使用,外边无法使用) 特点: 1、没有字面量: 别的数据类型,比如数组字面量 : [ ]、对象字面量:{ } 等等,但是Symbol符号没有字面量! 2、使用typeof 得到的就是symbol类型 const name = Symbol('name...

记录点滴 331

ES6中新增数据类型Symbol

** Symbol** 可以给对象新增私有属性,只能在对象内部进行访问 特点 没有字面量的写法 新的数据类型,typeof返回的是symbol 每次去调用Symbol函数得到的符号永远不会相等,不管符号描述是否相同 符号可以作为对象的属性名使用,这种属性名叫符号属性 可以通过设计,让外面无法访问到 符号属性不能被枚举 符号类型无法被隐式转换,数学运算,字符串拼接都是不行的,可以进行内部的显式转换...

呀呀呀 469

ES6新增基本数据类型——symbol

ES6新增基本数据类型——symbol 基本数据类型除了 number 、 string 、 boolean 、 object、 null 和 undefined ,还有ES6新增的symbol。 symbol的定义:表示独一无二的值,最大的用法是用来定义对象的唯一属性名。 基本用法: Symbol 函数栈不能用 new 命令,因为 Symbol 是原始数据类型,不是对象。可以接受一个字符串作为参数,为新创建的 Symbol 提供描述,用来显示在控制台或者作为字符串的时候使用,便于区分。 ...

weixin_45662100的博客 390

浅谈ES6新增数据类型:Symbol

面试中喜闻乐见的问题就是问我们的ES6新增了哪些个新特性 这篇文章一起学习一下新增的数据类型:Symbol JS的原始数据类型:6种Boolean,String,Undefined,NULL,Number,Symbol(ES6新增) 原始的数据类型种不包含object这点需要注意。Symbol是用来干什么的:用来区分我们的属性名的,用来定义对象的唯一属性名。 console.log...

dieluandan1410的博客 456

ES6 新增基本数据类型Symbol

  ES6增加了一个新的基本数据类型 symbol.不过,和其他基本数据类型相比,它有点与众不同,因为它没有字面量的表现形式,而且创建的方式也有点奇怪,只能通过调用全局函数Symbol()来完成。 let firstSymbol = Symbol();    这里注意一点,Symbol函数调用的时候,前面不要加new. 创建了一个symbol, 它有什么作用呢? 可以把它看作一个类...

weixin_30808575的博客 244

ES6 新增数据类型Symbol

今天更两篇,嘿嘿 想到什么就更什么,随缘更新大法。 这次讲一下ES6的新增数据类型Symbol,以前我们是五大基本数据类型,字符串(String)、数字(Number)、布尔值(Boolean)、未定义(Undefined)、对空(Null),现在成员喜加一。 Symbol 是 ES6 引入了一种新的原始数据类型,表示独一无二的值,最大的用法是用来定义对象的唯一属性名,那我们就试一试嘛。 Symbol 函数栈不能用 new 命令,因为 Symbol 是原始数据类型,不是对象。可以接受一个字符串作为参数

crsitin_spade的博客 439

ES6新增的Symbol

基础数据类型 ES6中引入了一种新的数据类型symbol,它是JS的第七种基础数据类型,前六种分别为:undefined、null、Boolean、String、Number、Object 由于Symbol是一种基础数据类型,所以当我们使用typeof去检查它的类型的时候,它会返回一个属于自己的类型symbol let s = Symbol() typeof s // "symbol" 我们可以...

zlear小窝 297

ES6新增的 Symbol

比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法,新方法的名字就有可能与现有方法产生冲突。如果有一种机制,保证每个属性的名字都是独一无二的就好了,这样就从根本上防止属性名的冲突。这是因为生成的 Symbol 是一个原始类型的值,不是对象,所以不能使用new命令来调用。这就是说,对象的属性名现在可以有两种类型,一种是原来就有的字符串,另一种就是新增的 Symbol 类型。凡是属性名属于 Symbol 类型,就都是独一无二的,可以保证不会与其他属性名产生冲突。Symbol 值可以显式转为。

Mxy18851251178的博客 451

undefined symbol怎么解决_ES6 新增的 Symbol 类型和作为属性的方法【15】

学习要点:1.Symbol 类型 2.Symbol 属性本节课我们来开始学习 ES6 新增的 Symbol 类型和作为属性的方法。一.Symbol 类型1. ES6 之前基础数据类型有:字符串、数值、布尔、对象、null 和 undefined;2. ES6 新增了一种叫做 Symbol 的基础数据类型,表示独一无二的值,类似 ID;3. 创建 Symobl 通过函数 Symbol...

weixin_39885412的博客 730
上一篇: JS 参数传递
下一篇: 前端安全 — XSS攻击
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值