ECMAScript 2019 中的 Symbol 如何实现更好的对象标识和属性描述?

阅读时长 4 分钟读完

在 ECMAScript 2019 中,Symbol 是一种新的原始数据类型。这种类型的主要作用是创建具有唯一性的对象标识符,以及提供一种新的方式定义对象属性。本文将介绍 Symbol 的特点、用法和实际应用。

Symbol 的特点

Symbol 是一种基本数据类型,使用 typeof 关键字可以得到 "symbol"。Symbol 值是不能被改变的,每个 Symbol 值都是唯一的。这意味着 Symbol 可以用作对象的标识符,因为两个 Symbol 值不可能相等。在一个程序中,多次调用 Symbol 函数返回的值也不会相等。

我们可以使用 Symbol 函数来创建一个新的 Symbol 对象。

从上面的代码可以看到,通过 Symbol() 创建的 Symbol 对象是没有字面量表示的,只能通过 mySymbol.toString() 转化成字符串输出。

除了创建不同的标识符外,Symbol 还有以下几个特点:

  1. 在 for...in 循环或 Object.keys() 方法中不会出现 Symbol 类型的键名。
  2. Symbol 类型的键名不会被 json 序列化。
  3. Symbol.for() 可以共享 Symbol。

使用 Symbol 定义属性

ES6 引入了 let 和 const 用于定义变量,ES2019 引入了 Symbol 用于定义属性。在传统的对象中,属性的键值都是字符串类型。使用 Symbol 定义属性可以更好地标识属性,避免属性名冲突。

我们可以使用 Symbol() 创建一个新的 Symbol 属性,并通过对象字面量或 Object.defineProperty 方法定义该属性。

-- -------------------- ---- -------
----- -------- - -------------------
----- --- - -
    ----------- --------
--

--------------------------- -- -------

-------------------------- --------- -
    ------ ---------------
    --------- -----
---

--------------------------- -- --------------

在上面的示例代码中,我们创建了一个名为 mySymbol 的 Symbol 属性,然后将其作为对象 obj 的属性使用。我们还使用 Object.defineProperty 方法更改了 mySymbol 的值。

实际应用

Symbol 使用场景非常广泛,在实际应用开发中,Symbol 也有很多用处:

  1. 对象私有属性。

    在 javascript 中没有私有属性一说,但是我们可以使用 Symbol 定义私有属性,其它开发人员就不会意外修改该属性值:

    -- -------------------- ---- -------
    ----- -------- - ---------------------
    ----- ------- -
        ------------------ -
            -------------- - ------
        -
        ---------- -
            ------ ---------------
        -
    -
    
    ----- -------- - --- ----------- ------- --------
    --------------------------------   -- ----
    --------------------------------- -- --- ------- ------
  2. 枚举。

    既然 Symbol 定义的属性不会出现在 for...in 循环中,那我们可以使用 Symbol 来定义一些枚举值。

总结

Symbol 具有唯一性和不可遍历性,能够帮助开发人员更好地定义对象标识符和属性。在实际应用开发中,Symbol 也可以用来模拟私有属性和枚举。需要注意的是,由于 Symbol 的唯一性特性,需要格外小心处理共享 Symbol 对象的情况。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/651b6c1c95b1f8cacd315ef6

纠错
反馈