📜  在 ES6 中引入符号的动机

📅  最后修改于: 2022-05-13 01:56:34.068000             🧑  作者: Mango

在 ES6 中引入符号的动机

Javascript 包含六种数据类型undefinednullbooleanStringNumberObject (包括数组数据类型)。 Symbol是 ES6 中新引入的数据类型,也称为 JavaScript 6,这使得 JavaScript 中的数据类型总数为 7。它是一种原始数据类型,意味着 Symbol 不能被实例化。符号是不可变的数据类型,并充当对象键的唯一标识符。在引入 Symbol 之前,很难生成唯一的对象键。维护唯一的对象键以防止覆盖具有相似对象键的值非常重要,因为这可能导致数据丢失。 Symbol 的引入帮助克服了这个问题,因为可以在不编写复杂代码的情况下生成唯一键。可以使用Symbol()函数生成唯一的对象键。 Symbol()函数返回符号类型的值。下面给出的示例演示了符号的用途。

句法:

let symbol = Symbol();

示例 1:在此示例中,我们将生成符号。

  • 代码:
    
    
  • 输出:
    Type of sym1:  symbol
    Type of sym2:  symbol

示例 2:在此示例中,我们将看到 Symbol()函数生成唯一的对象键。

  • 代码:
    
    
  • 输出:
    sym1===sym2: false

注意:符号数据类型是原始数据类型,不能实例化

符号和无符号的比较:让我们考虑一个需要维护学生在特定考试中获得的分数列表的示例。学生们还没有被分配他们的卷号。在这种情况下,学生的姓名将用作对象键。但是,姓名相似的学生可能不止一名。这可能会导致覆盖每个学生获得的分数,从而导致数据丢失。为了克服这个问题,可以使用符号数据类型。

  • 代码1:下面的代码片段显示了不使用符号时的场景。
    
    
  • 输出:当另一个同名学生出现时,克洛伊的分数被覆盖。
  • 代码2:下面的代码片段显示了使用符号时的场景
    
    
  • 输出:当另一个同名学生出现时,Chloe 的分数不会被覆盖,没有数据丢失。您必须在本地运行它。

符号的限制:

  • for..in 循环中忽略符号。
  • Object.keys()Object.getOwnPropertyNames()JSON.stringify()等函数忽略,因此无法序列化。
  • 符号主要用于确保隐私。但是像Object.getOwnPropertySymbols()这样的方法返回一个包含任何基于符号的键的数组,而Reflect.ownKeys()返回一个包含所有键的数组,包括符号。