完整解读 ECMAScript 2019 之 Symbol 新特性!

随着 ECMAScript(以下简称 ES)版本的不断更新迭代,Symbol 作为 ES6 新增的一种数据类型,已经成为了 ES 中非常重要的一部分,本文将对 Symbol 详细进行解读。

什么是 Symbol?

Symbol 是 ES6 引入的一种新的基本数据类型,表示独一无二的值,可以作为对象属性的标识符使用。与字符串不同,Symbol 值是不可变的。如果您希望对象中的某个属性确实是唯一的,那么 Symbol 就是一个非常好的选择。

创建 Symbol 的方式非常简单,只需调用 Symbol 函数,而且没有参数,看下面这个例子:

Symbol 唯一性

创建 Symbol 时,如果什么都不传入,Symbol 的值就是唯一的,即使创建多个没有参数的 Symbol,它们的值也会不同。

可以看到在上面的代码中,虽然 s1 和 s2 都是没有参数的 Symbol,但是它们的值是不同的,这就是 Symbol 的唯一性。

Symbol 对象

Symbol 类型的值只是使用 Symbol() 创建的基本类型。在 ES6 中,也可以使用 Symbol 构造函数创建 Symbol 对象。Symbol 对象是 Symbol() 函数的实例,它们包含 Symbol 值的显式包装器,其中的属性和方法可以被使用来操作 Symbol 值。

在上面的例子中,用 new 关键字创建 Symbol 对象会抛出 TypeError 异常。

Symbol 作为属性键

由于 Symbol 的唯一性和不变性,它非常适合作为对象属性的标识符使用,在使用 Symbol 作为属性键后,该属性不会出现在对象的枚举中。

下面的例子演示了如何使用 Symbol 作为属性键的方法:

在上面的代码中,使用了 Symbol("key") 创建了一个 Symbol,然后它被用作对象 a 的属性名。在使用 Object.getOwnPropertySymbols 方法时,该属性将会被列出来。

而使用 Object.getOwnPropertyNames 方法时,并不会输出这个属性,因为它被认为是一种特殊的类型,不能被列举。

预定义 Symbol

ES6 中定义了一些内置的 Symbol 值和函数,它们具有特殊的含义和用途。

Symbol.iterator

这个 Symbol 值是一个对象的属性,它定义了它的默认迭代器,它被原生的类型(如 Array, String 等)实现,因此可以通过 for...of 循环遍历这些类型的对象。

下面是一个使用 Symbol.iterator 实现遍历自定义对象的例子:

上面的代码中,使用 Symbol.iterator 创建了一个自定义对象的迭代器,然后使用 for...of 循环来遍历该对象。

Symbol.toStringTag

这个 Symbol 值是一个对象的属性,它定义了在 toString() 方法中的标记字符串,用于标识对象类型。

下面是一个有 Symbol.toStringTag 属性的自定义对象的例子:

上面的代码中,使用 Symbol.toStringTag 属性定义了自定义对象的标记字符串,当调用该对象的 toString() 方法时,将会输出该标记字符串。

总结

本文详细解读了 Symbol 的特性和用法,可以发现 Symbol 可以在对象中作为标识符使用,并保证值的唯一性和不变性。此外,ES6 还定义了一些内置的 Symbol 值和函数,它们提供了丰富的功能和方便的操作。掌握了 Symbol 的知识,可以让我们更加灵活地处理对象,并优化我们的代码。

以上内容详细解读了 ECMAScript 2019 之 Symbol 新特性,希望这篇文章对读者有所帮助,有助于更好的理解和应用 Symbol 的相关知识点。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/652e42147d4982a6ebf4e31d


纠错
反馈