JavaScript 为什么要有 Symbol 类型

首页 / 常见问题 / 低代码开发 / JavaScript 为什么要有 Symbol 类型
作者:低代码工具 发布时间:24-12-30 09:36 浏览量:5521
logo
织信企业级低代码开发平台
提供表单、流程、仪表盘、API等功能,非IT用户可通过设计表单来收集数据,设计流程来进行业务协作,使用仪表盘来进行数据分析与展示,IT用户可通过API集成第三方系统平台数据。
免费试用

JavaScript 引入 Symbol 类型的目的在于提供一个独一无二的标识符,防止属性名的冲突实现更好的属性封装性,以及为对象属性定义一些非字符串形式的元数据。例如,在使用第三方库时,可能会担心属性名冲突,Symbol 可以确保每个属性都是独一无二的,这就大大减小了冲突的可能性。

详细来说,Symbol 作为一种新的原始数据类型,相对于字符串这种传统属性名,其不可变且唯一的特性使得对象属性能够拥有一个唯一的标识符。通过这种方式,开发者可以安全地扩展对象而不必担心属性名冲突,这在大型代码库或者多人协作的项目中尤其有用。

一、SYMBOL的概念与创建

Symbol 类型被引入 JavaScript 是在 ES6(ECMAScript 2015)中。每个 Symbol 都是完全唯一的,即便你使用相同的描述创建多个 Symbol,它们也是不同的。

  • Symbol 的基本使用

创建一个 Symbol 非常简单,只需要调用 Symbol() 函数,并且可以选择性地提供一个描述字符串:

let sym1 = Symbol('my_symbol');

let sym2 = Symbol('my_symbol');

console.log(sym1 === sym2); // false

即使两个 Symbols 的描述是相同的,它们也是完全不同的。

  • Symbols 的独特性

Symbol 的主要特征就是它的唯一性,它通过这个特性提供了一种避免属性名冲突的方法,这在多个库或模块都试图向同一对象添加属性时非常有用。

二、SYMBOL在对象属性中的应用

Symbols 作为属性键来说,有几个特别的地方需要注意。

  • 使用 Symbol 作为属性键

可以使用方括号语法将 Symbol 作为对象属性的键:

let mySymbol = Symbol();

let obj = {

[mySymbol]: 'value'

};

console.log(obj[mySymbol]); // 'value'

由于 Symbol 不会与任何其他属性键冲突,因此它经常被用来表示一些非公开的、元数据等属性。

  • Symbol 属性的不可枚举性

默认情况下,使用 Symbol 作为键的属性不会出现在 for...infor...of 循环或 Object.keys()Object.getOwnPropertyNames() 方法返回的数组中。但是,它可以通过 Object.getOwnPropertySymbols() 方法来获取。

三、SYMBOL的内置值

ES6 引入的一些内置 Symbol 值,它们被称为“众所周知的 Symbols”。它们有特定的用途,并被赋予了对应的语义。

  • Symbol.iterator

这是一个用于定制对象的迭代行为的 Symbol。定义时,需要给对象设置一个返回迭代器的方法:

let collection = {

items: [],

*[Symbol.iterator]() {

for (let item of this.items) {

yield item;

}

}

};

  • 其他内置 Symbols

还有如 Symbol.matchSymbol.replace 等 Symbols,用于定制对象的基本行为,以上仅列举部分。

四、SYMBOL的全局注册表

有时,我们希望能在不同的代码片段或甚至是不同的 iframe/windows 中共享某些 Symbols。为此,ES6 提供了一个全局 Symbol 注册表。

  • 使用 Symbol.for()

利用 Symbol.for() 方法,可以创建一个全局的 Symbol。它在全局的范围内检查并注册 Symbol:

let globalSym = Symbol.for('app.global');

console.log(Symbol.for('app.global') === globalSym); // true

五、SYMBOL和JSON字符串化

当你尝试将一个对象进行 JSON 序列化时,Symbol 作为键的属性会被完全忽略:

let json = JSON.stringify({[Symbol('foo')]: 'bar'});

console.log(json); // '{}'

这意味着 Symbol 数据在经过 JSON.stringify() 处理时不会被包含在内。

六、SYMBOL的使用场景与实践

Symbol 类型的加入为 JavaScript 程序设计提供了新的可能性,以下是一些实际使用场景。

  • 防止XSS攻击

由于 Symbol 类型不是一个字符串,因此可以使用 Symbol 作为对象的键来避免因为动态属性访问而受到的 XSS 攻击。

  • 使用 Symbols 实现私有成员

在类的构造中,利用 Symbol 不可枚举的特性,可以模拟私有变量:

let _counter = Symbol();

let _action = Symbol();

class MyClass {

constructor(counter) {

this[_counter] = counter;

}

[_action]() {

// internal action

}

}

综上所述,Symbol 类型的引入解决了关于属性命名冲突的问题,尤其在组件化开发和大型应用中显示其价值。同时它的一些内建特性也使得它在处理对象的元编程方面发挥了作用。由于 Symbol 类型的唯一性和不可变性,它在现代 JavaScript 编程中常被用于表示独特的属性键、实现对象的内部状态和封装性、以及在编写可维护性更高和具有更佳隐私的代码方面发挥重要作用。

相关问答FAQs:

为什么 JavaScript 引入了 Symbol 类型?

  • Symbol 类型是 JavaScript 的一种基本数据类型,它的引入可以提供一种创建唯一标识符的机制。传统的标识符类型,如字符串或数字,可能会出现重复或冲突的情况。而使用 Symbol 类型,可以确保每个标识符都是唯一的,避免了命名冲突的问题。
  • Symbol 类型还可以用于创建隐藏的、不可遍历的属性或方法名。这对于创建私有成员或者定义一些特殊的行为非常有用。因为 Symbol 类型生成的属性名在普通的对象遍历中是不可见的,所以可以保护这些属性免受意外访问或修改。
  • 另外,Symbol 类型还提供了一些内置的符号常量,如 Symbol.iteratorSymbol.toStringTag,可以用于定义对象的默认迭代器或自定义对象的字符串表示形式。

Symbol 类型有什么特点和用途?

  • Symbol 类型的值是唯一的,即使两个 Symbol 值看起来完全一样,它们也是不相等的。这使得 Symbol 值非常适合用作对象的属性名,特别是在多人协作的项目中,可以确保属性名的唯一性。
  • 通过使用 Symbol 类型来创建对象属性,可以避免属性被意外访问和修改的风险。只有知道正确的 Symbol 值的代码才能够访问或修改对应的属性。
  • Symbol 类型还可以用于创建特殊的行为,例如通过定义 Symbol.iterator 属性为一个函数,可以使对象支持迭代操作。这样可以方便地通过 for...of 循环遍历对象。
  • 在 JavaScript 标准库中,有许多内置的 Symbol 值用于标识对象的特殊行为,如 Symbol.speciesSymbol.toPrimitive 等。开发者可以借助这些符号常量来定制对象的行为。

Symbol 类型如何与其他数据类型互操作?

  • Symbol 类型可以与其他数据类型进行隐式的类型转换,但转换结果不可预料。例如,将 Symbol 类型的值转换为字符串或数字类型时,会得到一个不具备实际意义的标识符字符串或高度随机的数字。
  • 与字符串类型的相互转换是最常见的。Symbol 值可以作为对象的属性名,而对象的属性名默认是字符串类型。因此,当使用 Symbol 类型的值作为属性名时,会自动调用其 toString 方法,将其转换为字符串类型。
  • 如果要明确地将 Symbol 类型的值转换为字符串,可以使用 String() 函数进行强制类型转换。类似地,使用 Number() 函数可以将 Symbol 类型的值转换为数字类型,但结果通常是不可用的。
最后建议,企业在引入信息化系统初期,切记要合理有效地运用好工具,这样一来不仅可以让公司业务高效地运行,还能最大程度保证团队目标的达成。同时还能大幅缩短系统开发和部署的时间成本。特别是有特定需求功能需要定制化的企业,可以采用我们公司自研的企业级低代码平台织信Informat。 织信平台基于数据模型优先的设计理念,提供大量标准化的组件,内置AI助手、组件设计器、自动化(图形化编程)、脚本、工作流引擎(BPMN2.0)、自定义API、表单设计器、权限、仪表盘等功能,能帮助企业构建高度复杂核心的数字化系统。如ERP、MES、CRM、PLM、SCM、WMS、项目管理、流程管理等多个应用场景,全面助力企业落地国产化/信息化/数字化转型战略目标。 版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们微信:Informat_5 处理,核实后本网站将在24小时内删除。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系邮箱:hopper@cornerstone365.cn 处理,核实后本网站将在24小时内删除。

最近更新

低代码拖拽平台:《拖拽式低代码平台》
01-09 18:19
低代码平台适合场景:《低代码平台适用场景分析》
01-09 18:19
低代码开发表单:《表单开发的低代码实现》
01-09 18:19
Designable低代码:《Designable低代码平台功能》
01-09 18:19
T+低代码开发:《T+平台低代码开发实践》
01-09 18:19
医疗低代码平台:《医疗行业的低代码应用》
01-09 18:19
前后端低代码:《低代码在前后端开发中的应用》
01-09 18:19
低代码开发插件:《低代码开发插件推荐》
01-09 18:19
低代码开发问题:《低代码开发常见问题解析》
01-09 18:19

立即开启你的数字化管理

用心为每一位用户提供专业的数字化解决方案及业务咨询

  • 深圳市基石协作科技有限公司
  • 地址:深圳市南山区科技中一路大族激光科技中心909室
  • 座机:400-185-5850
  • 手机:137-1379-6908
  • 邮箱:sales@cornerstone365.cn
  • 微信公众号二维码

© copyright 2019-2024. 织信INFORMAT 深圳市基石协作科技有限公司 版权所有 | 粤ICP备15078182号

前往Gitee仓库
微信公众号二维码
咨询织信数字化顾问获取最新资料
数字化咨询热线
400-185-5850
申请预约演示
立即与行业专家交流