ES6/ES8 中 Symbol 的使用案例
在 ES6/ES8 中,Symbol 是一种全新的数据类型,它可以用来创建独一无二的值,是 JavaScript 中一项很好的新特性。Symbol 只能用工厂函数来创建,不能用 new 命令。
Symbol 用法
- 创建 Symbol 类型
使用 Symbol() 函数来创建 Symbol 类型值,每个 Symbol 值都是唯一的,即使声明了相同的名称也不会相等。
const symbol1 = Symbol(); const symbol2 = Symbol("name"); const symbol3 = Symbol("name"); console.log(symbol1 === symbol2); // false console.log(symbol2 === symbol3); // false
- Symbol 用作对象的属性名
Symbol 可以用作对象的属性名,在创建对象时使用,可以更容易地保护这些属性以避免在程序中被意外修改或者删除。
const person = {}; const firstName = Symbol("firstName"); person[firstName] = "Tom"; console.log(person[firstName]); // Tom
在这个例子中,使用了一个 Symbol 类型的常量 firstName 作为属性名,并将其值设置为“Tom”,这时该属性不可能被其他 JavaScript 代码修改或者删除。
- Symbol 迭代(Symbol.iterator)
Symbol.iterator 用于定义一个类或对象的默认部署 Iterator 接口的方法,使其具有 for...of 遍历的能力。
-- -------------------- ---- ------- ----- ---------- - ----------------- - --------- - ----- - ------------------- - --- ----- - -- ----- ---- - ---------- ------ - ------ - -- ------ - ------------ - ------ - ------ ------------- -- - ---- - ------ - ----- ---- -- - - -- - - ----- ---------- - --- -------------------- ---------- --- ------ ----- -- ----------- - ------------------- - -- --- -- ------- -- -------
- Symbol 的静态属性(Symbol.species)
Symbol.species 用于为一个类指定一个创建导出对象的工厂方法的构造函数。
-- -------------------- ---- ------- ----- ------- ------- ----- - ------ --- ------------------ - ------ ------ - - ----- - - --- ---------- -- --- ----- ------ - ------- -- - - --- ------------------ ---------- --------- -- ----- ------------------ ---------- ------- -- ----
在这个例子中,我们创建了一个继承自 Array 的子类 MyArray,并通过 Symbol.species 静态属性指定了一个工厂函数 Array(),使得通过 map() 方法得到的变量 mapped 的类型为 Array。
Symbol 对象的方法和属性
- Symbol.hasInstance
Symbol.hasInstance 是用来指定一个构造函数是否认可一个对象作为它的实例的静态函数,用以定义 instanceof 运算符的行为。
class MyClass { static [Symbol.hasInstance](obj) { return obj instanceof Array; } } console.log([] instanceof MyClass); // true
在这个例子中,我们定义了一个 MyClass 构造函数,并使用 Symbol.hasInstance 定义 instanceof 运算符的行为,使其返回 true,即 Array 类型的对象可以被 Myclass 构造函数作为它的实例。
- Symbol.isConcatSpreadable
Symbol.isConcatSpreadable 用来控制某个对象在使用 concat() 方法时的行为,标识一个对象是否可以被扁平化展开。
let arr1 = [1, 2, 3]; let arr2 = [4, 5, 6]; arr2[Symbol.isConcatSpreadable] = false; console.log(arr1.concat(arr2)); // [1, 2, 3, [4, 5, 6]]
在这个例子中,我们设置 arr2 的 Symbol.isConcatSpreadable 属性为 false,这时在使用 arr1.concat(arr2) 时,arr2 不会被展开,而是当作一个整体放在 arr1 的尾部。
总结
Symbol 是一种全新的数据类型,用于创建独一无二的值。它能够将一些独有的概念标识出来,从而使数据类型的定义更加明确规范。通过使用 Symbol 类型,我们可以更加方便地创建独一无二的值,并且能够保护属性以避免被程序意外修改或删除,同时也能够控制对象在某些方法中的行为。它是 ES6/ES8 中非常有用的一项新特性,值得开发者们深入学习和使用。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64c601a595c405902ee49087