重学 Symbol

news2024/11/27 2:43:44

重学 Symbol

之前在写基础类型的笔记时暂时性的先跳过了 symbol,现在也有了一些项目的使用经验后,觉得还是需要重新回滚并且学习一下,温故而知新。

首先依旧回顾一下 symbol 的特点:

  • 是原始值

  • 唯一

  • 不可变

  • 可以提供私有属性,模仿其他语言中的 private

  • 不可以使用 new 关键词

    这是因为 JS 在实现的时候刻意避免了使用 new 关键词去调用原始值包装类型

  • Symbol 作为对象的 key 时不可被枚举

Symbol 的基本用法

虽然 Symbol 可以模拟私有类型,不过其刚开始被创造出来的意义是为了创建唯一属性,而非私有属性。

以下面代码为例:

const uid = Symbol('uid');

export const item = {
  [uid]: 'p1',
};
import { item } from './obj.js';

const uid = Symbol('uid');
item[uid] = 'p2';
console.log(item);

上面两段代码分别属于不同的 module,第一段中的 symbol 也没有被 expor。换言之,在其他地方使用的 item 这个对象的代码是无法获取到生成时创建的 symbol。

第二段代码用同样的字符串新创建了一个 Symbol,如果是其他属性的话,那么这时候 item 中对应的值可能就被重写了,不过 Symbol 不是:

在这里插入图片描述

可以看到,尽管两个 Symbol 中的字符串是一样的,但是 JS 会创建一个完全不同的 Symbol:

const uid2 = Symbol('uid');

console.log(uid === uid2);

在这里插入图片描述

搭配上 Symbol 不可被枚举的特性,就可以模拟成一个私有属性:

const uid = Symbol('uid');

item[uid] = 'p2';

console.log(item);
item.key = 'value';

console.log(Object.keys(item)); // 只有 key

在这里插入图片描述

项目中的使用案例

也因此,在我们的项目中,也会使用过 Symbol 去创建一些 ref 值(不需要被传到 API 中去的值),如:

class Example {
  constructor() {
    const privateKey = Symbol('private');
    this[privateKey] = 'private id';
    this.id = 0;
    this.value = 'value';
  }

  messageObj = () => {
    console.log(Object.keys(this));

    const messageObj = {};
    for (const key of Object.keys(this)) {
      if (!(this[key] instanceof Object)) {
        messageObj[key] = this[key];
      }
    }

    return messageObj;
  };
}

const example = new Example();
console.log(example.messageObj());

在这里插入图片描述

Symbol 的常用方法和属性

方法

我们的项目中用的是 export 的方法,不过怎么说呢……之前的开发做 ios 的,对 JS 不是很熟,正确的全局方法应该使用 Symbol.for() 去实现:

const sym1 = Symbol.for('shared symbol');
const sym2 = Symbol.for('shared symbol');

console.log(sym1 === sym2);

// 对比
const sym3 = Symbol('shared symbol');
console.log(sym3 === sym1);

在这里插入图片描述

如果要查找 symbol 是否被挂在到了全局分享上,就可以使用 keyFor() 进行查找:

console.log(Symbol.keyFor(sym3));
console.log(Symbol.keyFor(sym1));

在这里插入图片描述

鉴于每次调用 Symbol.for,JS 都会进行查找,如果没有注册当前输入的值,就会自动创建一个新的值这一操作,这个方法的使用范围还是比较有限的。

另外一个可能用得到的方法是 toString()

属性

属性又名 常用内置符号(Well-known Symbols),是 JS 内部暴露出来的,一些属于对象的内置属性。一些非常常用的功能(尤其是数组、set、map)都是 JS 内部实现的,不过也有一些情况下需要我们手动重写。

instanceof 就会隐式调用 [Symbol.hasInstance],而 [Symbol.isConcatSpreadable] 则是一个 boolean,这个值决定当 Array.prototype.concat() 中存在当前值是,它是会将当前值扁平化,还是保存为一个 array-like object 推进去。

目前实现的属性有下面这些:

在这里插入图片描述

对于日常开发来说,最重要的的是 iterator,其他的属性相对而言用的比较少。

另一个比较好用的是 toStringTag,对于开发和 debug 比较有帮助。这里不会列举所有的属性,毕竟这部分如果真的要用,参考 MDN 文档会更 up-to-date。

Symbol.toStringTag

主要使用方法如下:

class Example {}

const ex1 = new Example();
console.log(ex1.toString());

class Example2 {
  get [Symbol.toStringTag]() {
    return 'Example2';
  }
}

const ex2 = new Example2();
console.log(ex2.toString());

function Example3() {}
Object.defineProperty(Example3.prototype, Symbol.toStringTag, {
  get: function () {
    return 'Example3';
  },
});

const ex3 = new Example3();
console.log(ex3.toString());

function Example4() {}
Example4.prototype[Symbol.toStringTag] = 'Example4';

const ex4 = new Example4();
console.log(ex4.toString());

这个相对而言用于开发、debug 还是有一定效果的:

在这里插入图片描述

Symbol.iterator

Symbol.iterator 实现的方法是对象中的迭代器,所有可迭代对象——在 JS 中,这代表可以使用 for...of, [...arr] 或是 const [a, b, c] = arr 这种语法——在底层都会查找实现的迭代器。

这里继续举一个例子,如:

class Obj {
  constructor() {
    this.idx = 0;
    this.arr = [1, 2, 3];
  }

  *[Symbol.iterator]() {
    while (this.idx < this.arr.length) {
      yield this.arr[this.idx++];
    }
  }
}

const obj = new Obj();
for (const val of obj) {
  console.log(val);
}

const [a, b, c] = new Obj();
a;
b;
c;

在这里插入图片描述

Symbol.asyncIterator

本来写了个使用案例,后来发现那个更加偏向于 generator 的使用方式,没设么必要迭代实现,这里就丢一个 MDN 的案例:

const delayedResponses = {
  delays: [500, 1300, 3500],

  wait(delay) {
    return new Promise((resolve) => {
      setTimeout(resolve, delay);
    });
  },

  async *[Symbol.asyncIterator]() {
    for (const delay of this.delays) {
      await this.wait(delay);
      yield `Delayed response for ${delay} milliseconds`;
    }
  },
};

(async () => {
  for await (const response of delayedResponses) {
    console.log(response);
  }
})();

// Expected output: "Delayed response for 500 milliseconds"
// Expected output: "Delayed response for 1300 milliseconds"
// Expected output: "Delayed response for 3500 milliseconds"

这里主要还是搭配了一个异步的实现,可以在 for...of 循环中使用 await 去等结果。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

javaWeb ssh沙发销售系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh沙发销售系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Mye…

【SUMO】SUMO运行自带的OSM入门教程

文章目录 一、运行CMD命令行二、进入OSM选择地图位置 首先给出官网教程&#xff1a; https://sumo.dlr.de/docs/Tutorials/OSMWebWizard.html 一、运行CMD命令行 代码&#xff1a; 先进入osmWebWizard.py文件地址 cd /d D:\SUMO\sumo-1.17.0\tools&#xff08;替换成自己的…

智慧PG(pgting),一款拖拽式智能页面搭建系统

目录 前言 一、介绍 二、设计理念 1&#xff0c;资源整合&#xff0c;开箱即用 2&#xff0c;降低系统颗粒度 3&#xff0c;组件共享 4&#xff0c;简化配置 三、系统功能 1&#xff0c;可视化大屏搭建&#xff1a; 四、技术架构 1&#xff0c;技术栈 2&#xff0c;整体架构 五…

LeetCode 1091. Shortest Path in Binary Matrix【BFS,A星】中等

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

C++ 代码整洁之道

NOTICE: 这篇文章的框架条目来自《C代码整洁之道&#xff1a;C17可持续软件开发模式实践》&#xff0c;作者: [德] 斯提芬罗特。书籍原名"Clean C: Sustainable Software Development Patterns and Best Practices with C 17"。 文章目录 编码基本原则保持简单和直接…

Unity | HDRP高清渲染管线学习笔记:示例场景解析

目录 一、HDRP入门 1.HDRP设置 1.1 HDRP配置文件中的全部设置项 1.1.1 Rendering下的Lit Shader Mode 1.1.2 Lighting 下的Volumetrics&#xff08;体积光&#xff09;和Screen Space Reflection&#xff08;屏幕空间反射&#xff09; 2.离线渲染VS实时渲染 3.Volume组件 …

文字gif闪图怎么做?高效的gif闪图制作方法

相信不少新媒体行业的小伙伴&#xff0c;一定都见过那种闪动文字效果的gif动图吧。效果非常的炫酷还很吸引人们的眼球&#xff0c;但是作为设计小白这种闪烁gif图要怎么制作呢&#xff1f;有没有那种小白也能轻松上手的工具呢&#xff1f; 一、什么样的工具能够在线生成gif动态…

《Spring Guides系列学习》guide35 - guide40

要想全面快速学习Spring的内容&#xff0c;最好的方法肯定是先去Spring官网去查阅文档&#xff0c;在Spring官网中找到了适合新手了解的官网Guides&#xff0c;一共68篇&#xff0c;打算全部过一遍&#xff0c;能尽量全面的了解Spring框架的每个特性和功能。 接着上篇看过的gu…

项目管理自动化 工作效率顶呱呱

项目管理&#xff0c;是职场人进阶发展的必备高阶能力&#xff0c;需要在复杂的环境中有效整合资源、高效助力团队实现整体的项目目标。 一个好的项目管理者&#xff0c;需要合理规划项目进展&#xff0c;实时同步需求、及时沟通进展&#xff0c;合理判断项目风险&预警&am…

记一次用户反馈app在后台收不到push问题跟踪

我们的应该大范围推广后&#xff0c;今日用户群好多用户反馈安卓手机app在后台时收不到app的push消息&#xff0c;只有app处于前台时才能收到push消息。但是ios手机可以正常接收push消息。 拿到问题&#xff0c;首先想到从下面几个方便尝试定位&#xff1a; 1.用户手机app通知权…

财报解读:毛利持续改善,金山云正在“弯道超车”?

一季度&#xff0c;云巨头们的表现持续稳健&#xff0c;依旧稳坐前排&#xff0c;而作为中小云代表的金山云也在5月23日发布了2023年一季度财报&#xff0c;盈利能力持续改善成为通篇最亮眼的一笔。 随着AI大模型打开了新的“潘多拉魔盒”&#xff0c;云市场也在发生着巨变。 …

picoctf_2018_rop chain

小白垃圾笔记&#xff0c;不建议阅读。 这道题目其实我是瞎做的. 本地调试需要写一个文件名为flag.txt的文件。 先检查下保护&#xff1a;&#xff08;我把文件名改成pwn了&#xff09;&#xff0c;32位仅仅开启了nx 然后放到32位ida里&#xff1a; main函数如下&#xff1a…

〖Web全栈开发⑤〗— CSS基础

〖Web全栈开发⑤〗— CSS基础 (一)CSS基础1.1CSS介绍1.2CSS样式1.3CSS 格式 &#xff08;二&#xff09;CSS 选择器2.1标签选择器2.2类选择器2.3层级选择器2.4id选择器2.5组选择器2.6伪类选择器2.7通配符选择器 &#xff08;三&#xff09;样式表引入3.1外部样式表3.2内部样式表…

WPF入门实例 WPF完整例子 WPF DEMO WPF学习完整例子 WPF实战例子 WPF sql实例应用

WPF 和 WinForms 都是用于创建 Windows 桌面应用程序的开发框架&#xff0c;它们有一些相似之处&#xff0c;但也有很多不同之处。 在开发速度方面&#xff0c;这取决于具体情况。如果您熟悉 WinForms 开发并且正在开发简单的界面应用程序&#xff0c;则可能会比使用 WPF 更快…

《Spring Guides系列学习》guide41 - guide45

要想全面快速学习Spring的内容&#xff0c;最好的方法肯定是先去Spring官网去查阅文档&#xff0c;在Spring官网中找到了适合新手了解的官网Guides&#xff0c;一共68篇&#xff0c;打算全部过一遍&#xff0c;能尽量全面的了解Spring框架的每个特性和功能。 接着上篇看过的gu…

kaggle官方书籍推荐:The-Kaggle-Book

今天介绍一本kaggle出版的竞赛书籍。 这本书结合真实的kaggle竞赛题目&#xff0c;以及它们的冠军团队方案&#xff0c;介绍了参与机器学习竞赛的一些基础知识、经验技巧等。 内容涵盖Kaggle的介绍、建模问题以及技巧、如何利用Kaggle的经历来丰富简历等等。 书籍简介 参加 …

银河麒麟v4.0.2安装

银河麒麟v4.0.2安装 一、下载银河麒麟系统二、制作USB的启动镜像三、安装银河麒麟系统1、设置要被安装的机器bios启动模式为USB启动后&#xff0c;选择第一项&#xff1a;图形安装银河麒麟服务器操作系统2、设置用户和密码&#xff0c;右下角有继续&#xff0c;点击继续下一步3…

Axure教程—水平方向多色图(中继器)

本文将教大家如何用AXURE制作动态水平方向多色图 一、效果介绍 如图&#xff1a; 预览地址&#xff1a;https://l83ucp.axshare.com 下载地址&#xff1a;https://download.csdn.net/download/weixin_43516258/87822666 二、功能介绍 简单填写中继器内容即可生成动态水平多色…

操作系统层面下——进程状态讲解

目录 一.进程的状态&#xff1a;运行态 1.什么是运行状态&#xff1f; 2.进程进入内存的详细图解&#xff1a; 总结&#xff1a; 二.进程的状态&#xff1a;阻塞态 1.什么是阻塞状态&#xff1f; 三.进程的状态&#xff1a;挂起态 1.什么是挂起态&#xff1f; 2.阻塞与挂起的…

xss跨站之代码及http only绕过

什么是http only&#xff0c;在cookie中设置了http only属性&#xff0c;那么通过js代码无法获取cookie&#xff0c;并不能防止xss漏洞&#xff0c;在上一节的靶场网站源代码里面&#xff0c;写上这一串代码就是启动http only 再加上带去cookie的代码 然后我们再去访问网站的后…