在 JavaScript 中,每个变量的命名都是字符串类型的。但是如果你想要创建一个真正唯一的标识符,那么就需要使用 JavaScript 中新增的一种数据类型:Symbol。
Symbol 是 ECMAScript 2016 中新加入的一种基本数据类型,它能够创建一个唯一不重复的标识符,这个标识符无法被改变或者复制,因此可以用来作为对象的属性名或者其他一些需要保证唯一性的场景。
创建一个 Symbol
使用 Symbol 可以非常简单地创建一个唯一标识符:
const uniqueId = Symbol();
每次执行这段代码,都会创建一个新的唯一标识符。这个唯一标识符可以被用来作为对象的属性名甚至是普通变量的名称。
-- -------------------- ---- ------- ----- --- - --------- ----- --- - --------- ----- --- - - ------ ------ ------ ----- -- ---------------------- -- ----- ---------------------- -- -----
在这个例子中,我们使用了对象字面量的新语法来将一个 Symbol 当做属性名添加到了一个对象中。这可以让我们很方便地创建一个唯一的键,从而避免命名冲突。
使用 Symbol.for 创建可重复使用的 Symbol
除了可以通过 Symbol() 来创建一个唯一标识符以外,你还可以使用 Symbol.for() 来创建一个可重复使用的 Symbol。
const foo = Symbol.for("foo");
Symbol.for 会先在全局 Symbol 注册表中搜索是否存在名称为 "foo" 的 Symbol,如果存在则直接返回该 Symbol,否则会创建一个新的 Symbol 并放入全局注册表中等待下次使用。
由于全局注册表是存在的,因此你可以在不同的地方创建名称相同的 Symbol,这些 Symbol 实际上是相同的。这就让我们可以使用相同的标识符来表示相同的数据类型或者操作。
const foo1 = Symbol.for("foo"); const foo2 = Symbol.for("foo"); console.log(foo1 === foo2); // true
Symbol 的属性描述符
当你将一个 Symbol 当做对象的属性名的时候,可以为其设置一些特殊的属性描述符。
-- -------------------- ---- ------- ----- -------- - ------------------- ----- --- - --- -------------------------- --------- - ------ ------ ------- --------- ------ ----------- ----- ------------- ----- ---
这里我们使用 Object.defineProperty() 方法来为对象添加一个属性并为其设置了一些属性描述符。
其中 writable 表示属性是否可以被改变,enumerable 表示属性是否可以被枚举,configurable 表示是否可以被删除并且描述符是否可以被修改。
迭代器和 Symbol
在 ECMAScript 2015 中,我们引入了迭代器和生成器。它们可以让我们更方便地进行数据遍历以及自定义数据结构。
在 ECMAScript 2016 中,我们添加了一些新的 Symbol,它们都和迭代器和生成器相关。
- Symbol.iterator:用于定义一个对象的默认迭代器。
- Symbol.asyncIterator:用于定义一个对象的异步迭代器。
- Symbol.matchAll:用于在字符串中查找所有匹配的正则表达式。
这些 Symbol 可以用于创建一个迭代器,其中 Symbol.iterator 是最常用的。
-- -------------------- ---- ------- ----- --- - - ----- --- -- -- --- ------------------- - --- ----- - -- ------ - ----- -- -- - -- ------ - ----------------- - ------ - ------ ------------------- ----- ----- -- - ---- - ------ - ----- ---- -- - - -- - -- --- ------ ---- -- ---- - ------------------ -
在这个例子中,我们为一个对象添加了一个迭代器,在这个迭代器中,我们使用了箭头函数来定义 next 方法,它会返回一个对象,其中 value 表示当前遍历到的值,done 表示是否遍历结束。这个迭代器可以被用于 for...of 循环中。
结论
Symbol 是一个非常有用的功能,它可以帮助我们在 JavaScript 中创建唯一的标识符。在实际编程中,可以将其用在对象属性名唯一性的保证、自定义迭代器等场景中,为我们的代码增添灵活性和可读性。
学习 Symbol 的内容,也非常适合提升我们的 JavaScript 编程能力,因此我们应该多花时间去学习和掌握 Symbol。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67304ce5eedcc8a97c918fb8