Symbol 是 ES6 中全新的数据类型,它的作用是创建一个唯一的标识符。一个 Symbol 类型的值可以被用作对象属性名,它保证了属性名的唯一性。Symbol 的引入极大的增强了 JavaScript 的功能,让开发者能够更好地进行多种类型的操作。
创建 Symbol
我们可以使用 Symbol 函数来创建一个 Symbol 类型的数据。Symbol 函数接收一个可选的字符串参数,它会被用作 Symbol 实例的描述。
let symbol = Symbol(); console.log(symbol); // Symbol()
同时,我们可以指定一个字符串参数来描述创建的 Symbol 类型的值。
let symbol = Symbol('symbol description'); console.log(symbol); // Symbol(symbol description)
Symbol 作为对象属性名
在 JavaScript 中,对象属性名可以是字符串或符号(Symbol)。使用 Symbol 作为属性名可以更好的保证属性名的唯一性。因此,我们可以通过 Symbol 创建对象属性,如下所示:
const mySymbol = Symbol(); const myObject = {}; myObject[mySymbol] = 'Hello Symbol!'; console.log(myObject[mySymbol]); // "Hello Symbol!"
同时,我们可以在对象字面量中直接使用符号作为属性名:
const mySymbol = Symbol(); const myObject = { [mySymbol]: 'My Symbol Property' } console.log(myObject[mySymbol]); // "My Symbol Property"
内建 Symbol 值
JavaScript 中有一些内建的符号值,使用 Symbol 函数和这些值可以进行多种类型的操作:
Symbol.iterator
Symbol.iterator 用于定义对象的一个默认迭代器,用于迭代对象的每个属性。我们可以使用 for...of 循环语句将对象的属性依次读取出来。
-- -------------------- ---- ------- ----- -------- - --------- ----- -------- - - ----- - ---- ---- --- -- ----------- ---------- - --- ----- - --- --- ---- - ---------- ------ - ----- ---------- - -------- ------ - ------ ------------ ----- ----- -- ----------- -- - -- - -- ------- ----- -- --------------------- - ------------------- -
Symbol.toStringTag
Symbol.toStringTag 用于给我们自定义类的 toString 方法返回的字符串增加一个标记,方便我们进行辨识。
class MyObject { [Symbol.toStringTag]() { return 'MyObject'; } } console.log(Object.prototype.toString.call(new MyObject)); // "[object MyObject]"
Symbol.toPrimitive
Symbol.toPrimitive 用于定义对象的默认类型转换方法。这个方法接受一个字符串参数 hint,一共有三种情况:
- hint 为 "number" 时,表示要将对象转成数字类型;
- hint 为 "string" 时,表示要将对象转成字符串类型;
- hint 为 "default" 或者它没有指定时,表示要将对象转成默认类型。
-- -------------------- ---- ------- --- -------- - - -------------------------- - ------ ------ - ---- --------- ------ ---- ---- --------- ------ --- -------- -------- ------ ---------- - - - ---------------------- -- --------- ----------------------- -- --- --------------------------- -- --- -------
结论
Symbol 是 ES6 中的一个非常重要的对象类型,它在多种场景下都有很好的应用。我们可以利用 Symbol 去创建唯一的标识符,也可以使用内建 Symbol 值进行多种类型的操作。在我们的开发过程中,合理的运用 Symbol 可以让我们的代码更加可读、可维护、可扩展。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/671b79cb9babaf620fabfcec