Symbol类型

2023-11-15

如何定义symbol类型(2种方式)

let id1 = Symbol();
console.log(typeof id1);

如果我们将 id 定义为数字类型,当他们id相同时,判断它们是否相等,结果肯定是相等的。

   let id1 = 666;
   let id2 = 666;
   console.log(id1 === id2);// true

但是如果我们将它们定义为symbol类型,那么它们的值是永远不会一样的。

    let id1 = Symbol();
    let id2 = Symbol();

    console.log(id1 === id2);

另外,我们在之前提到了,symbol类型属于基本类型。所以它不是对象,你是不能给它添加属性的。

    let id1 = Symbol();
    id1.name = "codereasy"; //这样的写法是错误的

那么,有的同学可能会问,在上面的代码当中,如何区分 id1 和 id2 呢?我们声明的时候都是通过 Symbol()创建的,似乎不太好区分。所以,为了区分两个不同的symbol,我们在创建symbol类型的时候可以给他们加上描述。

    let id1 = Symbol("我是1号");
    let id2 = Symbol("我是2号");
    console.log(id1);

接下来,当我们打印 id1 和 id2 的时候就可以看到它们的描述了。如果你只想看到它的描述内容,可以使用 id1.description.

通过前面的介绍,我们知道每次 Symbol() 都会返回一个新的值,因此 id 1 和 id2的值是不一样的,如果我们想让 id1 === id2 应该如何操作呢?这就引出了定义symbol的第二种方式 symbol.for()

    let id1 = Symbol.for("我是1号");
    let id2 = Symbol.for("我是1号");
    console.log(id1 === id2);

当我们通过symbol.for来定义一个symbol类型之后,如果想要获取它的描述,应该怎么做呢?

let descroption = Symbol.keyFor(id1)

注意,Symbol.keyFor 这种方式只能获取 Symbol.for定义的变量。普通方式定义的是无法获取的。

应用场景

1.解决id重复的问题

    let salary = {
      张三: 6000,
      张三: 12000,
    };
    console.log(salary); //张三: 12000
    let person1 = {
      name: "张三",
      key: Symbol(),
    };

    let person2 = {
      name: "张三",
      key: Symbol(),
    };
    let salary = {
      [person1.key]: 6000,
      [person2.key]: 12000,
    };
    console.log(salary);

如果我们想看第二个张三的工资

salary[person2.key]

symbol的其他特性

key in 和key of dou不能遍历

    let person1 = {
      name: "张三",
      [Symbol()]: "我是symbol属性",
    };

    // for (const key in person1) {
    //   console.log(key);
    // }

    for (const key of Object.keys(person1)) {
      console.log(key);
    }

如果我们想遍历symbol,那么需要用以下代码

  for (const key of Object.getOwnPropertySymbols(person1)) {
      console.log(key);
    }

如果我们想要遍历所有属性,需要用Reflect.ownKeys()

    let person1 = {
      name: "张三",
      [Symbol()]: "我是symbol属性",
    };

    for (const key of Reflect.ownKeys(person1)) {
      console.log(key);
    }

定义私有属性

    let id = Symbol();
    class Student {
      constructor(name) {
        this.name = name;
        this[id] = 666;
      }
      getId() {
        return this[id];
      }
    }

    let codereasy = new Student();
    console.log(codereasy.getId());
    for (const key in codereasy) {
      console.log(key);
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Symbol类型 的相关文章

  • 将鼠标悬停时的鼠标光标更改为锚状样式

    如果我将鼠标悬停在div鼠标光标将更改为 HTML 锚点中的光标 我怎样才能做到这一点 假设你的div has an id myDiv 将以下内容添加到您的 CSS 中 这cursor pointer指定光标应与用于锚点 超链接 的手形图标
  • Javascript 函数查找数字的倍数

    创建一个名为的函数multiplesOf 它将接受两个参数 第一个参数是数字数组 第二个参数是数字 该函数应返回一个新数组 该数组由参数数组中的每个数字组成 该数字是参数数字的倍数 So multiplesOf 5 6 7 8 9 10 3
  • 在 contenteditable div 中选择范围

    我有一个contenteditablediv 和其中的一些段落 这是我的代码 div style border solid 1px black width 300px height 300px div Hello world div div
  • JavaScript 中的埃拉托斯特尼筛法对大量数据无限运行

    我一直在尝试写埃拉托斯特尼筛法 http en wikipedia org wiki Sieve of EratosthenesJavaScript 中的算法 基本上我只是按照以下步骤操作 创建从 2 到 n 1 的连续整数列表 令第一个素
  • 如何使用javascript将大图像转换为十六进制?

    如果我尝试将图像转换为十六进制 无论我使用哪个函数 我都会收到此错误消息 该图像的大小为 7 MB 19812 毫秒 清理 1401 2 1455 0 gt 1401 2 1455 0 MB 9 9 0 ms 自上次 GC 以来 8 3 m
  • 如何格式化 Highcharts 的 (x,y) 对数据的日期时间

    我的序列化方法会产生如下所示的日期时间字符串 2014 07 09T12 30 41Z 为什么下面的代码不起作用 function container highcharts xAxis type datetime series data x
  • 隐藏 Div 的父级

    我只是想隐藏父divcomments section div class content content green div div div 我试过这个 document getElementById comments section pa
  • Draggable JS Bootstrap 模式 - 性能问题

    对于工作中的项目 我们在 JavaScript 中使用 Bootstrap Modal 窗口 我们想让一些窗口可移动 但我们遇到了 JQuery 的性能问题 myModal draggable handle modal header Exa
  • 防止 iOS 键盘在 cordova 3.5 中滚动页面

    我正在使用 Cordova 3 5 和 jQuery mobile 构建 iOS 应用程序 我在大部分应用程序中禁用了滚动功能 但是 当我选择输入字段时 iOS 键盘会打开并向上滚动页面 我不想要这个功能 由于输入足够高 键盘不会覆盖它 我
  • 如何纠正流警告:解构(缺少注释)

    我正在编写一个小型 React Native 应用程序 并且正在尝试使用 Flow 但我无法在任何地方真正获得有关它的正确教程 我不断收到错误 destructuring Missing annotation 有关 station 这段代码
  • 将 GMT 时间转换为当地时间

    我以这种格式从我的服务器获取 GMT 时间 Fri 18 Oct 2013 11 38 23 GMT 我的要求是使用Javascript将此时间转换为本地时间 例如 如果用户来自印度 首先我需要采用时区 5 30并将其添加到我的服务器时间并
  • 使用 CSS 或 Javascript 填充动画

    我只是想知道是否可以使用 CSS 或 javascript 创建填充动画 基本上我想创建一个填充动画 如下图所示 http i40 tinypic com eit6ia png http i40 tinypic com eit6ia png
  • 为什么我们在打字稿中使用 HTMLInputElement ?

    我们为什么使用 document getElementById ipv as HTMLInputElement value 代替 document getElementById ipv value 功能getElementById返回具有类
  • Vuejs 2:去抖动不适用于手表选项

    当我在 VueJs 中反跳此函数时 如果我提供毫秒数作为原语 它就可以正常工作 但是 如果我将其提供为对 prop 的引用 它会忽略它 这是道具的缩写版本 props debounce type Number default 500 这是不
  • Three.js 各种大小的粒子

    我是 Three js 的新手 正在尝试找出添加 1000 个粒子的最佳方法 每个粒子都有不同的大小和颜色 每个粒子的纹理是通过绘制画布创建的 通过使用粒子系统 所有粒子都具有相同的颜色和大小 为每个粒子创建一个粒子系统是非常低效的 有没有
  • 使用 Vue 的多模式组件

    我在 Vue 中实现动态模式组件时遇到问题 A common approach I follow to display a set of data fetched from the db is I dump each of the rows
  • 在 JavaScript 循环之外声明变量可以提高速度和内存?

    C 也有类似的问题 但我们没有看到 JavaScript 的任何问题 在循环内声明变量是否可以接受 假设循环有 200 次迭代 使用样本 2 相对于样本 1 是否有性能要求 内存和速度 我们使用 jQuery 来循环 它提高了我们将 var
  • 如何隐藏/禁用 Highcharts.js 中的图例框?

    我想问是否可以使用 HighCharts js 库隐藏图表中的所有图例框 var chart object chart renderTo render to type graph type colors graph colors title
  • 用于交互式图形绘制的轻量级 JavaScript 库? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有兴趣了解用于绘制交互式图表的最轻量级 javascript 库 我掌握的数据主要是与海洋研究相关的科学数据 我知道一些 jquery
  • Jquery - 选择选项后如何获取选项的特定数据类型?

    我将直接跳到标记 然后解释我想要做什么 HTML 选择选项

随机推荐

  • 设置路由分发规则

    1 创建子路由 定义项目路由 设置路由参数 index应用配置 配置index应用的路由urls py 测试index应用的路由配置 访问http 127 0 0 1 8000
  • 一个45岁大爷第一天学习python的心得,现在开始还算晚吗

    写在前面的话 本人今年45岁了 初中文化 感觉都不好意思写出来 哈哈 之前没有学过编程方面的东西 前段时间在头条上看到潘石圪在学习python编程 于是从各方面去了解了一下python到底是个什么 赶紧找了一下度娘 不看不知道 一看吓一跳啊
  • ubuntu提示根目录存储空间不足的解决办法

    因为每次使用系统都会产生大量的日志文件 如果没有设置自动清理日志文件或者分区较小 日志文件在一段时间的堆积后就会导致存储空间不足 所以需要清除日志文件 以下是清除步骤 1 切换为超级用户 su 2 查看日志文件大小 du h max dep
  • 【Windows】win10电脑Miracast投屏到电视

    Miracast 是一项无线技术 你的电脑可以使用它来将你的屏幕投影到电视 投影仪和同样支持 Miracast 的流媒体播放器 你可以使用此技术共享你在电脑上执行的操作 展示幻灯片放映 甚至在更大的屏幕上玩你喜爱的游戏 为你的设备做好准备
  • 目前最受欢迎的12个Python开源框架,你用过几个?

    今天给大家带来了12个在GitHub等开源网站中最受欢迎的Python开源框架 如果你正在学习python 那么这12个开源框架 千万别错过 这些框架包括事件I O OLAP Web开发 高性能网络通信 测试 爬虫等 虽说不上是全都有 但也
  • UE4 导航网格的使用

    在使用导航网格前 应先设置项目导航系统支持的导航代理者 Agents 在项目设置中 找到导航系统页面 DirtyAreasUpdateFreq 表示导航网格变化时 检测变化并更新的频率 这里可以设置导航系统的一些参数 包括是否允许客户端导航
  • DT下重新定义设置发布发布条数后的跳转页面

    destoon系统有些地方还是做得不够细致 今天给大家分享一个重新定义发布条数满了以后的页面跳转 正常逻辑跳转应该是会员升级页面而不是会员中心首页 修改方法如下 感谢DT朋友提供的修改方案 打开根目录文件 module article my
  • el-tree 阻止点击节点的时候自动展开或者收缩

    expand on click node 是否在点击节点的时候展开或者收缩节点 默认值为 true 如果为 false 则只有点箭头图标的时候才会展开或者收缩节点 但设置的时候 要加上 不然无效
  • 点选文字验证码识别

    最近在学习爬虫 碰到很多验证登录 今天分享一个点选文字验证码识别以及我在使用的验证码识别平台 上篇文章有涉及滑块验证 首先 注册一个超级鹰账号 选择充值0 5 1元即可 进入用户中心 gt 软件ID 生成一个用来接入接口的软件ID 下载示例
  • Acwing-二叉树的镜像

    遍历树中的所有点 每次遍历完之后把左右儿子swap一下 Definition for a binary tree node struct TreeNode int val TreeNode left TreeNode right TreeN
  • 线程池七大参数

    线程池的七大参数是指使用 ThreadPoolExecutor 创建线程池时所设置的 7 个参数 分别为 public ThreadPoolExecutor int corePoolSize int maximumPoolSize long
  • VScode for c++

    VScode for c VScode for c launch json version 0 2 0 configurations name gdb Launch type cppdbg request launch program wo
  • java集合之Map

    java集合之Map Map接口概述 将键映射到值的对象 一个映射不能包含重复的键 每个键最多只能映射到一个值 Map接口和Collection接口的不同 Map是双列的 Collection是单列的 Map的键唯一 Collection的
  • Linux Rsync服务详解(二)——Rsync服务实战

    今天继续给大家介绍Linux运维相关内容 本文主要内容是Rsync服务详解 一 Rsync实战 接下来 我们选择使用两台设备进行Rysnc的备份实战 设备一IP地址 192 168 136 101 设备二IP地址 192 168 136 2
  • 【openGL2021版】天空盒

    openGL2021版 天空盒 大家好 我是Lampard猿奋 欢迎来到船新的openGL基础系列的博客 今天主要实现的是天空盒 1 什么是天空盒 上周我们已经实现了FPS式的摄像机控制 键盘的 WSAD 可以控制摄像头的前后左右移动 鼠标
  • FPGA面试题【Verilog实现一个2位带进位全加器,画出门级电路】

    目录 题目 核心思路 答案 FPGA全貌 题目 Verilog实现一个2位带进位全加器 画出门级电路 核心思路 思路见代码注释 答案 2位加法器顶层模块 module top s cout a b cin 输入输出端口及变量定义 outpu
  • MySQL的 timze_zone 和 SpringBoot 的 serverTimezone 的设置

    查看和修改 MySQL 的时区 system time zone 系统时区 在MySQL启动时会检查当前系统的时区并根据系统时区设置全局参数system time zone的值 system time zone 变量只有全局值没有会话值 不
  • thinkphp5学习路程 四 模板调用及视图渲染

    继承 think Controller 类 以下类可以直接使用 fetch 渲染模板输出 display 渲染内容输入 assign 模板变量赋值 engine 初始化模板引擎
  • Mockjs模拟登录接口数据

    一丶安装mockjs cnpm install mockjs save dev 二丶创建Mock文件 Mock文件下包含index js mock服务 和user js mock数据 index js 首先引入Mock const Mock
  • Symbol类型

    如何定义symbol类型 2种方式 let id1 Symbol console log typeof id1 如果我们将 id 定义为数字类型 当他们id相同时 判断它们是否相等 结果肯定是相等的 let id1 666 let id2