学习笔记 JavaScript ES6 Symbol

【前端学习之路】 ES6新特性 Symbol 和 Iterator(尚硅谷课程笔记) 遍历该对象时,其属性不会出现在for..in循环中,利用。 阅读详情

学习内容

  • Symbol是新的原型数据类型
  • 声明方式
  • 应用场景

单词释义

Symbol:(独一无二的)

n. 象征,代表; 标志; 符号,记号

JS七个原始数据类型

undefine、null、number、string、boolean、object、symbol

Symbol是新的原型数据类型

第一种声明方式:

let s1 = Symbol()
let s2 = Symbol()
let s3 = Symbol('three') // 传入字符串用于对symbol的描述
let s4 = Symbol('four')
console.log(s1)
console.log(s2)
console.log(s1 === s2)

console.log(s3)
console.log(s4)
console.log(s3 === s4)

-------------------------
Symbol()
Symbol()
false
Symbol(three)
Symbol(four)
false

第二种声明方式

当参数是对象的时候,会自动调用该对象的toString方法,转化成一个字符串,再生成一个symbol的值:

const obj = {
    name : 'Sure'
}
console.log(Symbol(obj))

const obj1 = {
    name : 'Sure',
    toString() { // 对象内部function的简写形式
        return this.name
    }
}

console.log(Symbol(obj1))

------------------------------------------
Symbol([object Object])
Symbol(Sure) // 自动调用了obj1中的toString()


不能像声明对象的方法去声明Symbol(),比如:


let s = Symbol()
s.name = 'aaa'
console.log(s)

-------------------------------------------
Symbol() // 什么都没有,因为symbol不是一个对象

Symbol可以理解为不能重复的字符串,就是把它理解成字符串就行。

下面看一个symbol的API:

let s = Symbol()
let t = Symbol('desc')

console.log(s.description)
console.log(t.description)

------------------------
undefined
desc

第三种声明方式

let s1 = Symbol.for('orion')
let s2 = Symbol.for('orion')

console.log(s1 === s2)

-----------
true

上面代码中s1和s2相等,是因为这样的声明方式是全局的,当再次现出Symbol.for('orion')时,会去全局中查找是否有Symbol.for('orion'),如果有,就把值赋给s2。

再看把symbol.for写在方法内部,发现也是在全局中存在的:

function test() {
    return Symbol.for('test')
}

const x = test()
const y = Symbol.for('test')

console.log(x === y)

------------
true

与Symbol.for对应的还有一个Symbol.keyFor,作用是返回一个已经全局登记的Symbol类型的key:

let s1 = Symbol('test')
console.log(Symbol.keyFor(s1))

let s2 = Symbol.for('test')
console.log(Symbol.keyFor(s2))

----------------------------------------
undefined // Symbol('test')不属于全局定义
test // 使用全局定义

Symbol应用场景一:

班级中有重名的同学

下面这种写法,第二个李四把第一个李四覆盖掉了:


const grade = {
    李四: {addr : 'aaa', tel : 'bbb'},
    李四: {addr : 'ccc', tel : 'ddd'}
}

console.log(grade)
--------------------------------
李四: {addr: 'ccc', tel: 'ddd'}

下面这种写法,把key用变量表示,还是会有覆盖的情况:

const stu1 = '李四'
const stu2 = '李四'
const grade = {
    [stu1] : {addr : 'aaa', tel : 'bbb'},
    [stu2]: {addr : 'ccc', tel : 'ddd'}
}

console.log(grade)

-------------------------------
李四: {addr: 'ccc', tel: 'ddd'}

用Symbol作为key,保证key不冲突

这时Symbol的作用就体现出来了,两个李四全都可以输出:

const stu1 = Symbol('李四')
const stu2 = Symbol('李四')
const grade = {
    [stu1] : {addr : 'aaa', tel : 'bbb'},
    [stu2]: {addr : 'ccc', tel : 'ddd'}
}

console.log(grade)
console.log(grade[stu1]) // grade[stu1] 等价于 grade.key
console.log(grade[stu1])

---------------------------------------
Symbol(李四): {addr: 'aaa', tel: 'bbb'}
Symbol(李四): {addr: 'ccc', tel: 'ddd'}
{addr: 'aaa', tel: 'bbb'}
{addr: 'aaa', tel: 'bbb'}

Symbol应用场景二:

一定程度上可以保护类中的某些属性,比如使用for in无法遍历出对象中的symbol属性

const sym = Symbol('syu6')
class User {
    constructor(name) {
        this.name = name
        this[sym] = 'syu.com'
    }

    getName() {
        return this.name + this[sym]
    }
}
const user = new User('Sure')
// console.log(user.getName())

// 使用for in遍历对象的属性
for(let key in user) { // 无法取得symbol属性
    console.log(key)
}

for(let key of Object.keys(user)) { // 无法取得symbol属性
    console.log(key)
}

for(let key of Object.getOwnPropertySymbols(user)){ // 只能取到symbol属性
    console.log(key)
}
console.log('-------------')
for(let key of Reflect.ownKeys(user)) { // 普通属性和symbol属性都可以取到
    console.log(key)
}
----------------------------------
name
name
Symbol(syu6)
-------------
name
Symbol(syu6)

Symbol应用场景三:

消除魔术字符串

魔术字符串是指多次出现,被多次引用,每次都手写的话容易出错:

function getArea(shape) {
    let area = 0
    switch(shape) {
        case 'Triangle' : 
            arae = 1
            break
        case 'Circle' :
            area = 2
            break
    }
    return area
}
console.log(getArea('Triangle')) // 这里的'Triangle'就是魔术字符串,写两次很麻烦,还容易出错

看下面的实现方式就好很多:

const shapeType = {

    // triangle : 'Triangle',
    // circle : 'Circle'

    // 把上面两行改为下面这样,其实我们并不关心symbol()是什么,主要是key就可以说明我们想的东西了
    triangle : Symbol(),
    circle : Symbol()
}

function getArea(shape) {
    let area = 0
    switch(shape) {
        case shapeType.triangle : 
            area = 1
            break
        case shapeType.circle :
            area = 2
            break
    }
    return area
}
console.log(getArea(shapeType.triangle)) // 这里的'Triangle'就是魔术字符串,写两次很麻烦,还容易出错

---------
1

 

JavaScript编码之路【ES6新特性之 Symbol 、Set 、Map、迭代器、生成器】 嘟三~ 嘟三~ 今日份广播题目:“怎么让JavaScript越来越6”。接下来,小菜鸡本人将和大家一起来探讨ES6-ES13的那些酷酷的新特性,从这次广播开始,你也可以炫耀:“这个ES新特性我都用得溜溜的!// 不能这样获取。 阅读详情

相关推荐

SAP CO-PA数据传送避坑指南:销售开票与FI/MM记账的日常配置实操(含KEKF/KE4I/KEI2)

本文深入解析SAP CO-PA数据传送中的常见配置问题,特别是销售开票与FI/MM记账环节的实操避坑指南。通过KEKF/KE4I/KEI2等关键配置点的详细说明,帮助用户避免数据失真和重复记录,提升获利能力分析的准确性。文章结合实战案例,揭示官方文档未提及的'数据黑洞'形成机制,为SAP顾问提供实用的排雷手册。

weixin_26905487的博客 390

JS(6).Symbol详细介绍

Symbol详细介绍

wsz123456wsz的博客 5449

huggingface 镜像站推荐

在做 Ai 应用开发或者学习的时候,我们经常需要下载各种模型,而 huggingface 的模型下载速度很慢或者根本就连不上,这里推荐一个 huggingface 的镜像站,速度很快,可以大大提高我们的效率。

t951984189的博客 1万+

前端进阶攻略之ES6中的Symbol

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

zm17671443092的博客 3066

SAP BSP网页开发入门:从SE80创建到MVC实战(附成品展示)

本文详细介绍了SAP BSP网页开发的入门与实战,从SE80环境搭建到MVC架构实现的全流程。通过具体案例和代码示例,帮助开发者掌握业务服务器页面(BSP)技术,提升SAP Web化转型中的开发效率,适用于需要扩展SAP功能的企业场景。

x1y2z的博客 1万+

MIPI D-PHYv2.5笔记(11) -- 高速时钟传输(High-Speed Clock Transmission)

在High-Speed模式中,Clock Lane提供了一个低摆幅(low-swing)、差分DDR时钟信号,此信号从Master到Slave,用于为高速数据传输提供时钟信号。时钟信号关于Forward Direction中的Data Lane上的位切换序列(toggling bit sequence)有正交相位,并且在一次burst的第一个被传输的bit的中心点有一个上升沿。

vivo01的专栏 3019

JavaScript进阶(十八):ES6 Symbol 用法

Symbol是es6中一种新增的数据类型,它表示独一无二的值。es5把数据类型分为基本数据类型(字符串、数字、布尔、undefined、null)和引用数据类型(Object),es6中新增的Symbol数据类型划分到基本数据类型。为什么会有这样一种数据类型呢?//别人定义好的对象//你拿到对象想给这对象添加新的属性和方法的时候,可能会创建出一个name属性和showName方法这个时候,新增加的方法和属性就会去把原有的方法覆盖,这样就产生了冲突。

IT全栈 华强工作室 1805

小白学电路之cadance搭建buffer电路

Buffer(缓冲器)是一种放大器或驱动电路,主要用于隔离输入和输出,以防止负载对前级电路造成干扰或影响。本文作者在电路方面是小白水平,目前正在学习,有不足之处欢迎指正。3.创建新的cellview,对此buffer进行仿真验证。2.创建buffer的symbol。电路中的V2的详细参数。

weixin_58051657的博客 1984

JavaScript基础: ES6新特性---Symbol

简单的聊了一些Symbol的一些特点,比如Symbol和Symbol.for的区别,还有一些属性会影响对象某些方法的机制,比如Symbol.iterator,Symbol.hasInstance,Symbol.toPrimitive,Symbol.toStringTag。然后进行了实例演示。

u011863822的博客 1251

基于CNN对抗嵌入的图像隐写——CNN-Based Adversarial Embedding for Image Steganography

CNN-Based Adversarial Embedding for Image Steganography https://ieeexplore.ieee.org/abstract/document/8603808 这篇论文发表在TIFS( IEEE TRANSACTIONS ON INFORMATION FORENSICS AND SECURITY),TIFS是网络与信息安全领域的国际两大顶级期刊之一,中国计算机学会(CCF)推荐的A类期刊,SCI一区TOP期刊,目前影响因子有7多了。 1 概

weixin_48654804的博客 2279

【ARFoundation自学04】AR Tracked Image 图像追踪识别与对应类的调用

1.添加组件 2.创建图像识别库 3.创建识别后追踪的物体(UI、模型等)

leoysq的博客 2560

es6中关于symbol的用法,以及使用场景

es6中关于symbol的用法,以及使用场景

涂涂 1153

【Bug已解决】Claude Desktop Cowork 报错 Workspace unavailable 解决方案

方案适用场景推荐指数确认虚拟机镜像下载完整性排查的第一步,最基础的前提检查⭐⭐⭐⭐⭐确认虚拟机平台功能已启用Windows 系统功能层面的必要条件⭐⭐⭐⭐⭐重启 CoworkVMService快速尝试恢复服务正常状态⭐⭐⭐⭐完全重启客户端排除临时性状态错乱⭐⭐⭐⭐降级使用文件工具临时替代方案,不阻塞当前工作⭐⭐⭐报错的本质是Cowork 功能依赖的虚拟机管理服务,在 Windows 应用包隔离机制下未能正确定位虚拟机文件的实际存放路径。

博客 6224

js-ES6学习笔记-Symbol

1、ES6引入了一种新的原始数据类型Symbol,表示独一无二的值。它是JavaScript语言的第七种数据类型,前六种是:Undefined、Null、布尔值(Boolean)、字符串(String)、数值(Number)、对象(Object)。 2、Symbol值通过Symbol函数生成。这就是说,对象的属性名现在可以有两种类型,一种是原来就有的字符串,另一种就是新增的Symbol类型。凡是...

源辰_付鹏程 143

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【转】js-ES6学习笔记-Symbol

原文: https://www.cnblogs.com/zczhangcui/p/6435652.html   https://blog.mgechev.com/2017/09/16/developing-simple-interpreter-transpiler-compiler-tutorial/ 看这篇文章的时候,实现一个简单的js解释器。 看到 Symbol () 这个语法,顺便查了一下,...

weixin_34327761的博客 110

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【JS011】ES6的学习笔记之原始数据类型Symbol

日期:2021年8月23日 作者:Commas 注释:如果您觉得有所帮助,帮忙点个赞;如果有不对的地方,还望各位大佬不吝赐教,谢谢^ - ^ (ง •_•)ง 积跬步以致千里,ES6的学习笔记 1.01365 = 37.7834;0.99365 = 0.0255 1.02365 = 1377.4083;0.98365 = 0.0006 文章目录一、Symbol的介绍与创建二、Symbol的特点三、Symbol的内置属性 一、Symbol的介绍与创建 说明:Symbol是ES6引入的一种新的原始数据.

Commas的博客 170

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

ES6之Symbol详解

目录一、什么是Symbol?二、Symbol的作用三、Symbol的语法规范1. 基本语法2. Symbol属性的遍历3. Symbol.for(),Symbol.keyFor()四、内置的Symbol值1. Symbol.hasInstance2. Symbol.isConcatSpreadable3. Symbol.species4. Symbol.match/replace/search/...

夕山雨的博客 2万+

es6中symbol详解

ES6中引入了第6种原始类型:Symbol 创建Symbol let firstName = Symbol(); let person = {}; person[firstName] = '欧阳不乖' console.log(person[firstName]); //'欧阳不乖' Symbol函数接受一个可选参数,可以添加一段文本描述即将创建的Symbol,这段属描述不可用于属性访问,但是建议...

团长的博客 4099

ES6中的 Symbol

目录1.概述2.symbol值的生成3.作为属性名的Symbol值4.symbol数据的总结注意symbol是一个ES6标准中新增的一种基本数据类型,Symbol类型数据的原理:保证每一个属性名都是独一无二的,从根本上防止属性名的冲突。symbol 的值是通过 Symbol() 函数生成, 每一个 symbol 的值都是唯一的,Symbol() 函数可以接受一个字符串作为参数,表示对该值的描述,因此即使定义 symbol 使用相同的参数互相之间也不是相同的: 3.作为属性名的Symbol值

weixin_47075145的博客 2622

ES6中的Symbol类型

小火柴的蓝色理想 </div><!--end: blogTitle 博客的标题和副标题 --> <div id="navigator"> 博客园 首页 新随笔 联系 订阅 管理 <div id="blog_stats"> 随笔 - 698  文章 - 0  评论 - 1

思无邪的博客 8808

ES6 Symbol 使用场景

图片来源于阮一峰博客 ES6 新增了第 7 种原始数据类型 Symbol,简单介绍一下它的使用方法及使用场景。 Symbol 含义及使用方法 symbol 英文意思为 符号、象征、标记、记号,在 js 中更确切的翻译应该为 独一无二的值,理解了它的意思之后再看起来就简单多了。 可以通过下面的方式来创建一个 symbol 类型的值 const s = Symbol(); console.lo...

weixin_34080903的博客 5506
上一篇: 学习笔记 JavaScript ES6 ES6中的类与继承
下一篇: 学习笔记 JavaScript ES6 Set
白鸽同学
博客等级 码龄20年 9粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值