首页 > 其他分享 >js基本数据类型——Symbol

js基本数据类型——Symbol

时间:2024-04-05 16:31:08浏览次数:17  
标签:const log Symbol 数据类型 js obj console 属性

一、介绍

Symbol是ES6中新加的基本数据类型。可以用于解决对象属性名称冲突的问题,以及提供一种唯一的标识符。还是不清楚?别急,先看看下面的场景:

  • 现在我要用一个User类来表示用户对象,每个用户对象都有一个唯一的userId,并且我希望能够将这个对象的一些属性标记为私有属性,例如密码userPassword。用Symbol可以这样实现:
// 使用 Symbol 来定义私有属性和唯一标识符
const userId = Symbol('userId');
const userPassword = Symbol('userPassword');

class User {
  constructor(id, password) {
    this[userId] = id;
    this[userPassword] = password;
  }

  // 公有方法可以访问私有属性
  getId() {
    return this[userId];
  }
}

// 创建用户对象
const user1 = new User(1, 'password123');

// 无法直接访问私有属性
console.log(user1.userId); // undefined
console.log(user1.userPassword); // undefined

// 可以通过公有方法访问私有属性
console.log(user1.getId()); // 输出 1

二、用法

现在你应该可以大概感受到Symbol的意义了,但是他的意义不止于此,可以再通过他的其他用法再来体会一下:

1. 唯一标识:

// 创建一个 Symbol 值
const mySymbol = Symbol(); // 有时候会看到Symbol('标识符'),()里面的字符串并没有实际用途,只是作为一个标识符,后期调试可能会有用处

// 使用 Symbol 作为对象属性的键
const obj = {};
obj[mySymbol] = 'Hello';

// 使用 Symbol 作为属性名
console.log(obj[mySymbol]); // 输出 'Hello'

// 创建另一个 Symbol 值
const mySymbol2 = Symbol();

// Symbol 值是唯一的
console.log(mySymbol === mySymbol2); // 输出 false

2. 不能用for…in遍历

// 接着上面的代码继续写
for (let key in obj) {
  console.log(key); // 不会输出任何内容
}

// 可以使用 Object.getOwnPropertySymbols 获取所有 Symbol 属性
const symbols = Object.getOwnPropertySymbols(obj);
console.log(symbols); // 输出 [Symbol()]

3. 定义对象的属性并访问

// 创建两个不同的 Symbol
const prop1 = Symbol('prop1');
const prop2 = Symbol('prop2');

// 定义一个对象,并使用 Symbol 定义其属性
const obj = {
  // 使用 Symbol 定义属性1
  [prop1]: 'value1',
  
  // 使用 Symbol 定义属性2
  [prop2]: 'value2'
};

// 访问对象的属性1和属性2
console.log(obj[prop1]); // 输出 'value1'
console.log(obj[prop2]); // 输出 'value2'

  • 注意到这里的写法是有用[]括起来的,这是为了跟普通的属性区分开。
  • 如果用obj.prop1访问还是会返回undefined,因为Symbol类型是基本类型,而点运算符操作的是一个以属性名称命名的简单标识符,不能是一个数据类型,方括号运算符后面则可以放字符型属性甚至可以放表达式。

4. Symbol自带的方法

  • Symbol.for(key):

    • 这个方法接受一个字符串参数 key,用于在全局 Symbol 注册表中查找是否存在对应键为 key 的 Symbol。
    • 如果存在则返回已经存在的 Symbol。
    • 如果不存在则创建一个新的 Symbol,并将其注册到全局 Symbol 注册表中,以 key 作为键关联起来。
    • 该方法保证了全局的唯一性,即相同的 key 会对应同一个 Symbol,可以使得你可以在不同的地方获取到同一个 Symbol。
    const sym1 = Symbol.for('sharedSymbol');
    const sym2 = Symbol.for('sharedSymbol');
    
    console.log(sym1 === sym2); // 输出 true,因为它们引用了同一个 Symbol
    
  • Symbol.keyFor(sym):

    • 这个方法接受一个 Symbol 参数 sym,用于查找与该 Symbol 相关联的键
    • 如果该 Symbol 已经被注册过(使用 Symbol.for 方法),则返回与之关联的键。
    • 如果该 Symbol 没有被注册过,则返回 undefined
    const sym = Symbol.for('sharedSymbol');
    const key = Symbol.keyFor(sym);
    
    console.log(key); // 输出 'sharedSymbol'
    

标签:const,log,Symbol,数据类型,js,obj,console,属性
From: https://blog.csdn.net/2301_79111443/article/details/137400767

相关文章

  • three.js基础
    记录下three.js的学习历程。three.js基本概念包括画布Canvas、渲染器Renderer、场景Scene、相机Camera、光源Light、几何体Geometry、材质Material、颜色纹理、点模型、线模型、网格模型、阴影、外部三维模型、动画等 基础<canvasid="basic"></canvas><scripttype="impo......
  • 二叉树计算【华为OD机试JAVA&Python&C++&JS题解】
    一.题目-二叉树计算给出一个二叉树如下图所示:6/79\/-26请由该二叉树生成一个新的二叉树,它满足其树中的每个节点将包含原始树中的左子树和右子树的和。20(7-2+9+6)/\-26\/......
  • 学生重新排队【华为OD机试JAVA&Python&C++&JS题解】
    一.题目-学生重新排队n个学生排成一排,学生编号分别是1到n,n为3的整倍数。老师随机抽签决定将所有学生分成m个3人的小组,n=3*m为了便于同组学生交流,老师决定将小组成员安排到一起,也就是同组成员彼此相连,同组任意两个成员输入描述:之间无其它组的成员。因此老师决定调整队伍,......
  • `.gitattributes` 文件中的 *.js linguist-language=ts *.tsx linguist-language=ts
    .jslinguist-language=ts和.tsxlinguist-language=ts是针对特定文件类型的元数据标记,它们的作用是在特定的上下文中指示这些文件的实际编程语言类型,而非其扩展名所暗示的语言。具体来说:.jslinguist-language=ts表示尽管文件以.js扩展名结尾,但实际上它应该被视为TypeScr......
  • 万户ezOFFICE-wf_printnum.jsp存在SQL注入漏洞
    声明:本文仅用于技术交流,请勿用于非法用途由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。简介万户EZOFFICE是一款办公软件,由中国万户网络科技有限公司开发和提供。该软件提供了一系列办公管理工具,包括......
  • Node.js毕业设计基于WEB的学生成绩查询系统(Express+附源码)
    本系统(程序+源码)带文档lw万字以上  文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义选题背景:随着信息技术的飞速发展,互联网已经深入到我们生活的每一个角落。教育领域也不例外,越来越多的学校开始利用网络技术进行教学管理。其中,学生成绩查询系统是一......
  • Node.js毕业设计基于Web的选课系统(Express+附源码)
    本系统(程序+源码)带文档lw万字以上  文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义选题背景:在当今信息化社会,教育行业也在不断地进行数字化改革。其中,选课系统作为学校教学管理的重要组成部分,其效率和准确性直接影响到学生的学习体验和教学质量。传......
  • 什么是数据类型,什么是数据结构。
    数据类型,是人对数据的分类。人用这个信息,人自己或者让编译器做一种运动,将一种形式的数据转换成另一种形式的数据。数据结构,是人认为的数据之间的关系。数据类型是程序设计语言或者编译原理的概念。只讨论数据结构,可以不使用数据类型这个概念,可以不用高级程序设计语言,可以直接用......
  • Java -fastjson api
    构造json对象需求:构造以下请求体{"attrSelectionVO":[{"attrAccessId":"eea99a0894504a2b89f3cfeb4be051d3","attrValueList":[{"attrValue":"输送型","att......
  • nodejs+python开发基于uniapp的校园跑腿系统 微信小程序
    本文先提出了开发基于uniapp的高校校园跑腿系统的背景意义,然后通过功能性和非功能性分析阐述本系统的需求,然后从功能设计和数据库设计两方面进行系统的设计建模。在技术实现部分采用了nodejs作为开发后台的编程语言,客户端使用uniapp,数据库选择MySQL。最后进行了代码的编写,并说......