在 ECMAScript 6 中,引入了 Symbol 类型,它是一种新的原始数据类型,用于创建唯一的标识符。Symbol 可以用作对象属性的键,这样可以避免属性名冲突的问题。在 ECMAScript 2020 中,Symbol 类型得到了进一步的改进和增强,但在使用时仍需注意以下事项。
1. Symbol 值的唯一性
Symbol 值是唯一的,每个 Symbol 值都有自己的标识符。因此,使用 Symbol 作为对象属性的键时,可以避免属性名冲突的问题。但需要注意的是,即使 Symbol 的描述相同,它们也是不相等的。
const s1 = Symbol('foo'); const s2 = Symbol('foo'); console.log(s1 === s2); // false
上述代码中,s1 和 s2 都是通过 Symbol('foo') 创建的,但它们并不相等,因为它们都是唯一的。
2. Symbol 的可迭代性
在 ECMAScript 2020 中,Symbol 类型新增了一个内置的 Symbol.iterator 属性,用于指定对象的默认迭代器。如果一个对象具有 Symbol.iterator 属性,则可以使用 for...of 循环遍历它。
-- -------------------- ---- ------- ----- --- - - ------------------ --------- -- - ----- -- ----- -- ----- -- - -- --- ------ ---- -- ---- - ------------------ - -- - -- - -- -展开代码
上述代码中,obj 对象具有 Symbol.iterator 属性,该属性的值为一个生成器函数,用于生成对象的迭代器。通过 for...of 循环遍历 obj 对象时,会依次输出生成器函数生成的值。
3. Symbol 的包装对象
在 JavaScript 中,原始数据类型和对象类型是有区别的。原始数据类型(包括 Undefined、Null、Boolean、Number 和 String)是不可变的,而对象类型是可变的。在 ECMAScript 6 中,Symbol 类型也是一种原始数据类型,因此它是不可变的。但是,如果将 Symbol 类型封装在一个对象中,则可以改变它的值。
-- -------------------- ---- ------- ----- -- - -------------- ----- --- - - ----- ----- -- --------------------- -- --- ----- -- - ----------- ---------------- -- ----------- --------------------- -- ---展开代码
上述代码中,s1 是一个 Symbol 类型的变量,它的值为 Symbol('foo')。将 s1 作为对象的属性名时,可以获取到对应的属性值。然而,将 s1 封装在一个对象中后,就可以通过 Object() 函数将其转换成一个包装对象。此时,s2 的值为 Symbol('foo'),但它是一个对象类型的值,因此可以作为对象的属性名使用,并且可以获取到对应的属性值。
4. Symbol 的内置属性
在 ECMAScript 2020 中,Symbol 类型新增了一些内置的 Symbol 属性,用于指定对象的行为。以下是一些常用的内置 Symbol 属性:
- Symbol.toStringTag:用于指定对象的默认 toString() 表示形式。
- Symbol.hasInstance:用于指定对象的 instanceof 行为。
- Symbol.species:用于指定对象的默认构造函数。
-- -------------------- ---- ------- ----- ------- ------- ----- - ------ --- ------------------ - ------ ------ - - ----- --- - --- ---------- -- --- ----- ------ - ------------ --- ------------------ ---------- --------- -- ----- ------------------ ---------- ------- -- ----展开代码
上述代码中,MyArray 类继承自 Array 类,并且重写了 slice() 方法。在 MyArray 类中,通过 static get Symbol.species 指定了默认的构造函数为 Array。因此,在对 arr 数组进行 slice() 操作时,返回的结果是一个 Array 类型的对象,而不是 MyArray 类型的对象。
结语
Symbol 类型是 ECMAScript 6 中新增的一个原始数据类型,用于创建唯一的标识符。在 ECMAScript 2020 中,Symbol 类型得到了进一步的改进和增强,但在使用时需要注意其唯一性、可迭代性、包装对象和内置属性等问题。掌握这些注意事项,可以更好地使用 Symbol 类型,提高代码的质量和可维护性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d12fdda941bf71342837d3