ECMAScript 2016:如何使用 Symbol 做键?

阅读时长 6 分钟读完

在 ECMAScript 2015 中,我们有新的数据类型 SymbolSymbol 是一种原始数据类型,用于创建唯一的标识符。它可以用作对象属性的键值,这种方式更加安全,因为不会被其他变量覆盖。

在本篇文章中,我们将学习如何使用 Symbol 做键,并提供一些示例代码帮助你了解 Symbol 的具体使用方法。

创造一个 Symbol

我们可以通过 Symbol() 函数来创建一个 Symbol。每次调用 Symbol() 函数都会创建一个新的 Symbol

比如下面这个例子:

在上面的代码中,我们创建了一个 Symbol 并使用 typeof 来查看它的类型,结果为 "symbol"。

还可以向 Symbol() 函数中传入一个字符串参数,用于描述这个 Symbol,如下所示:

在上面的例子中,我们将字符串参数 "example" 传递给 Symbol() 函数,创建了一个描述为 "example" 的 Symbol。当我们在控制台中输出这个 Symbol 时,会返回 "Symbol(example)"。

在本文的后续例子中,我们会经常使用一个名为 keySymbol 变量,用于演示如何使用 Symbol 做键。

使用 Symbol 做对象属性的键值

在创建了一个 Symbol 后,我们可以将它用作对象属性的键值。这种用法与字符串键值有些不同,具体的地方在于字符串键值可以被其他变量覆盖,而 Symbol 则不会。

例如下面这个例子:

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

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

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

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

在上面的代码中,我们使用 Symbol 作为对象 obj 的一个属性键值,并将其值设置为 "example"。另外,我们也展示了如何使用另一个 Symbol 做键值,并将其值设置为 "another example"。

需要注意的是,使用 Symbol 作为对象属性的键值,它不会出现在对象的 for…in 循环中和 Object.keys()JSON.stringify() 的结果中,因此更适合用作私有属性。

Symbol.for() 和 Symbol.keyFor()

Symbol.for()Symbol.keyFor() 是两个实用的函数,可以用来创建全局的共享 Symbol,从而能够在多个对象之间共享 Symbol 的键值。

当我们使用 Symbol() 函数时,每次调用都会创建一个新的 Symbol。这意味着即使两个 Symbol 的描述相同,它们也不是相同的。

但是,当我们使用 Symbol.for() 函数时,会为每个传入的 key 创建一个全局 Symbol。如果多次使用相同的 key 调用 Symbol.for(),它会返回同一个 Symbol

在上面的代码中,我们调用 Symbol.for("key") 创建 Symbol。全局 Symbol 的 intenral description 为 "key",并且该函数始终返回相同的 Symbol

此外,您还可以使用 Symbol.keyFor() 函数来查找全局 Symbol 的 key。

在上面的例子中,我们查找了 Symbol.for("key") 创建的全局 Symbol 的 key,结果为 "key"。

总结

在本文中,我们学习了如何使用 Symbol 做键,并提供了一些示例代码,如何使用 Symbol.for()Symbol.keyFor() 在不同的对象之间共享 Symbol 的键值。现在,您应该可以自信地在项目中使用 Symbol 了!

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

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

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

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

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

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

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

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

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

纠错
反馈