【ES6复习笔记】Symbol 类型及其应用(9)

一、Symbol 简介

Symbol 是 JavaScript 中的一种基本数据类型,它表示唯一的标识符。Symbol 的主要目的是防止属性名冲突,尤其是在多个代码库或模块中共享对象时。Symbol 值可以用作对象的属性名,这样可以确保属性名是唯一的,不会与其他属性名冲突。Symbol定义的对象属性不能使用for…in循环遍历,但可以使用 Reflect.ownKeys 来获取对象的所有键名。

二、Symbol 的创建

可以使用 Symbol() 函数来创建一个新的 Symbol 值。这个函数可以接受一个可选的字符串参数,作为 Symbol 的描述。描述只是为了调试目的,不会影响 Symbol 的唯一性。

let s1 = Symbol();
console.log(s1, typeof s1); // Symbol() "symbol"

let s2 = Symbol('尚硅谷');
let s2_2= Symbol('尚硅谷');
console.log(s2 === s2_2); // false

// 使用 Symbol.for 定义
let s3 = Symbol.for('尚硅谷');
let s3_2 = Symbol.for('尚硅谷');
console.log(s3 === s3_2); // true

在上面的代码中,s1s2s2_2 都是不同的 Symbol 值,尽管 s2s2_2 的描述相同。

三、Symbol 的应用

1. 作为对象的属性名

Symbol 可以用作对象的属性名,这样可以确保属性名是唯一的,不会与其他属性名冲突。

let game = {
    name:'俄罗斯方块',
    up: function(){},
    down: function(){}
};

let methods = {
    up: Symbol(),
    down: Symbol()
};

game[methods.up] = function(){
    console.log("我可以改变形状");
}

game[methods.down] = function(){
    console.log("我可以快速下降!!");
}

console.log(game);

在上面的代码中,methods.upmethods.down 是两个 Symbol 值,它们被用作 game 对象的属性名。这样,即使其他代码也使用了 updown 作为属性名,它们也不会冲突。

2. Symbol 内置属性

除了定义自己使用的 Symbol 值以外,ES6 还提供了 11 个内置的 Symbol 值,指向语言内部使用的方法,称为“魔术方法”,因为它们会在特定的场景下自动执行。。例如,Symbol.hasInstance 可以用来定义一个对象是否是某个类的实例,Symbol.isConcatSpreadable 可以用来控制数组的展开行为。

  • Symbol.hasInstance:当其他对象使用 instanceof 运算符,判断是否为该对象的实例时,会调用这个方法。
  • Symbol.isConcatSpreadable:对象的 Symbol.isConcatSpreadable 属性等于的是一个布尔值,表示该对象用于 Array.prototype.concat() 时,是否可以展开。
  • Symbol.species:创建衍生对象时,会使用该属性。
  • Symbol.match:当执行 str.match(myObject) 时,如果该属性存在,会调用它,返回该方法的返回值。
  • Symbol.replace:当该对象被 str.replace(myObject) 方法调用时,会返回该方法的返回值。
  • Symbol.search:当该对象被 str.search(myObject) 方法调用时,会返回该方法的返回值。
  • Symbol.split:当该对象被 str.split(myObject) 方法调用时,会返回该方法的返回值。
  • Symbol.iterator:对象进行 for...of 循环时,会调用 Symbol.iterator 方法,返回该对象的默认遍历器。
  • Symbol.toPrimitive:该对象被转为原始类型的值时,会调用这个方法,返回该对象对应的原始类型值。
  • Symbol.toStringTag:在该对象上面调用 toString 方法时,返回该方法的返回值。
  • Symbol.unscopables:该对象指定了使用 with 关键字时,哪些属性会被 with 环境排除。
class Person{
    static [Symbol.hasInstance](param){
        console.log(param);
        console.log("我被用来检测类型了");
        return false;
    }
}

let o = {};

console.log(o instanceof Person);

const arr = [1,2,3];
const arr2 = [4,5,6];
arr2[Symbol.isConcatSpreadable] = false;
console.log(arr.concat(arr2));

在上面的代码中,Symbol.hasInstance 被用来定义 Person 类的 instanceof 操作符的行为,Symbol.isConcatSpreadable 被用来控制数组的 concat 方法的展开行为。

四、总结

Symbol 是 JavaScript 中一种非常有用的数据类型,它可以用来创建唯一的标识符,防止属性名冲突,并且可以用来定义对象的一些特殊行为。通过合理使用 Symbol,可以使代码更加健壮和可维护。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

转运机器人推动制造业智能化转型升级

​在当今制造业智能化转型的浪潮中,技术创新成为企业脱颖而出的关键。富唯转运机器人凭借一系列先进技术,成为智能转型的卓越之选。 一体化 AMR 控制系统是富唯的一大亮点。它采用低代码流程搭建和配置模式,极大地缩短了部署时间。企业无需耗…

同步异步日志系统:设计模式

设计模式是前辈们对代码开发经验的总结,是解决特定问题的⼀系列套路。它不是语法规定,⽽是⼀ 套⽤来提⾼代码可复⽤性、可维护性、可读性、稳健性以及安全性的解决⽅案。 为什么会产生设计模式这样的东西呢?就像人类历史发展会产生兵法。最开…

数据分析思维(五):分析方法——假设检验分析方法

数据分析并非只是简单的数据分析工具三板斧——Excel、SQL、Python,更重要的是数据分析思维。没有数据分析思维和业务知识,就算拿到一堆数据,也不知道如何下手。 推荐书本《数据分析思维——分析方法和业务知识》,本文内容就是提取…

AppInventor2 ClientSocketAI2Ext 拓展加强版 - 为App提供TCP客户端接入,可发送二进制数据

本文介绍App Inventor 2利用拓展实现TCP/IP协议接入功能,作为网络客户端连接TCP服务器,进行数据通信(发送/接收)。 // ClientSocketAI2Ext 拓展现状 // 原版拓展名称为:com.gmail.at.moicjarod.aix,是能用…

Docker-构建自己的Web-Linux系统-镜像webtop:ubuntu-kde

介绍 安装自己的linux-server,可以作为学习使用,web方式访问,基于ubuntu构建开源项目 https://github.com/linuxserver/docker-webtop安装 docker run -d -p 1336:3000 -e PASSWORD123456 --name webtop lscr.io/linuxserver/webtop:ubuntu-kde登录 …

随身 WiFi 连接 X-Wrt 共享网络与 IPv6 中继配置

本文首发于只抄博客,欢迎点击原文链接了解更多内容。 前言 之前分享的《随身 WiFi 通过 USB 连接路由器共享网络 扩展网络覆盖范围》介绍了随身 WiFi 通过 USB 连接到路由器共享网络,其中留下两个小问题没有解决: OpenWrt 无法识别中兴微的…

3.银河麒麟V10 离线安装Nginx

1. 下载nginx离线安装包 前往官网下载离线压缩包 2. 下载3个依赖 openssl依赖,前往 官网下载 pcre2依赖下载,前往Git下载 zlib依赖下载,前往Git下载 下载完成后完整的包如下: 如果网速下载不到请使用网盘下载 通过网盘分享的文件…

家用无线路由器的 2.4GHz 和 5GHz

家中的无线路由器 WiFi 名称有两个,一个后面带有 “5G” 的标记,这让人产生疑问:“连接带‘5G’的 WiFi 是不是速度更快?” 实际上,这里的 “5G” 并不是移动通信中的 5G 网络,而是指路由器的工作频率为 5G…

【HarmonyOS NEXT】鸿蒙原生应用“上述”

鸿蒙原生应用“上述”已上架华为应用市场,欢迎升级了鸿蒙NEXT系统的用户下载体验,用原生更流畅。 个人CSDN鸿蒙专栏欢迎订阅:https://blog.csdn.net/weixin_44640245/category_12536933.html?fromshareblogcolumn&sharetypeblogcolumn&a…

AI开发:使用支持向量机(SVM)进行文本情感分析训练 - Python

支持向量机是AI开发中最常见的一种算法。之前我们已经一起初步了解了它的概念和应用,今天我们用它来进行一次文本情感分析训练。 一、概念温习 支持向量机(SVM)是一种监督学习算法,广泛用于分类和回归问题。 它的核心思想是通过…

Linux部署spring项目基础教程

目录 一、安装jdk(yum安装) 1.查看是否有jdk ​编辑 2.查找你想安装的jdk版本 3.安装你需要的版本 4.重复第一步查看版本号,看到版本号说明安装成本 二、部署服务 1.上传jar包 2.启动服务 3.脚本启动 自己搞了个服务器,部署了一个demo项目,把部署流程记录下 一、…

JS中的原型与原型链

1. 基本概念 原型(Prototype):每个对象都有一个内部属性 [[Prototype]],通常通过 __proto__ 访问(非标准,但广泛支持)。 原型链(Prototype Chain):对象通过原…

如何从 0 到 1 ,打造全新一代分布式数据架构

导读:本文从 DIKW(数据、信息、知识、智慧) 模型视角出发,探讨数字世界中数据的重要性问题。接着站在业务视角,讨论了在不断满足业务诉求(特别是 AI 需求)的过程中,数据系统是如何一…

Docker完整技术汇总

Docker 背景引入 在实际开发过程中有三个环境,分别是:开发环境、测试环境以及生产环境,假设开发环境中开发人员用的是jdk8,而在测试环境中测试人员用的时jdk7,这就导致程序员开发完系统后将其打成jar包发给测试人员后…

华为 AI Agent:企业内部管理的智能变革引擎(11/30)

一、华为 AI Agent 引领企业管理新潮流 在当今数字化飞速发展的时代,企业内部管理的高效性与智能化成为了决定企业竞争力的关键因素。华为,作为全球领先的科技巨头,其 AI Agent 技术在企业内部管理中的应用正掀起一场全新的变革浪潮。 AI Ag…

Idea使用阿里云创建springboot项目

文章目录 创建springboot项目选择Spring Initializr配置Server URL 创建springboot项目 选择Spring Initializr 配置Server URL https://start.aliyun.com

安全教育培训小程序系统开发制作方案

安全教育培训小程序系统是为了提高公众的安全意识,普及安全知识,通过微信小程序的方式提供安全教育培训服务,帮助用户了解并掌握必要的安全防范措施。 一、目标用户 企业员工:各岗位员工,特别是IT部门、财务、行政等对…

MySQL 数据”丢失”事件之 binlog 解析应用

事件背景 客户反馈在晚间数据跑批后,查询相关表的数据时,发现该表的部分数据在数据库中不存在 从应用跑批的日志来看,跑批未报错,且可查到日志中明确显示当时那批数据已插入到数据库中 需要帮忙分析这批数据丢失的原因。 备注:考虑信息敏感性,以下分析场景测试环境模拟,相关数据…

2024年11月HarmonyOS应用开发者高级认证 最新题库

新增单选 1.下述代码片段中的renderGroup属性,对性能的影响是什么:A A.劣化 B.不一定 C.没有变化 D.优化 2.在刷新Image组件内容时,如果观察到画面会闪一下白块,要怎样优化才能避免白块儿出现,同时又不会卡住画面…

《Opencv》基础操作详解(1)

目录 一、Opencv简介 OpenCV 的主要特点 二、Opencv库安装 1、opencv-python库安装 2、opencv-contrib-python库安装 三、Opencv 基础操作 1、opencv库的导入 2、读取、展示图片 3、查看图片信息 4、控制图片显示时间、关闭窗口 5、读取灰度图 6、彩色图片转灰度图 …