在 ECMAScript 2019 中,Symbol 是一个新的原始数据类型。它是一种独一无二的标识符,可以用来作为对象属性的键,用来解决对象属性名冲突的问题。本文将介绍 Symbol 的基本用法,并提供一些示例代码,帮助你更好地理解和应用它。
Symbol 的创建
在 JavaScript 中,我们可以使用 Symbol() 函数来创建一个 Symbol 类型的值。Symbol 函数接收一个可选的参数,表示 Symbol 的描述信息,可以用于调试和识别。
const sym1 = Symbol(); const sym2 = Symbol('foo'); console.log(sym1); // Symbol() console.log(sym2); // Symbol(foo)
需要注意的是,Symbol() 函数创建的每个 Symbol 值都是唯一的,即使它们的描述信息相同。这意味着,两个描述信息相同的 Symbol 值也不相等。
const sym1 = Symbol('foo'); const sym2 = Symbol('foo'); console.log(sym1 === sym2); // false
Symbol 作为对象属性名
在 JavaScript 中,对象的属性名可以是字符串或者数字。然而,由于字符串是可变的,容易发生冲突,而数字只能是整数,不够灵活。这时,Symbol 就可以派上用场了。
我们可以使用 Symbol 作为对象的属性名,来避免属性名冲突的问题。
const obj = {}; const sym = Symbol('foo'); obj[sym] = 'bar'; console.log(obj); // { [Symbol(foo)]: 'bar' } console.log(obj[sym]); // bar
需要注意的是,使用 Symbol 作为属性名时,必须使用方括号语法来访问属性值。
const obj = {}; const sym = Symbol('foo'); obj[sym] = 'bar'; console.log(obj.sym); // undefined console.log(obj[sym]); // bar
内置的 Symbol 值
ECMAScript 2019 定义了一些内置的 Symbol 值,用于表示对象的内部属性或方法。这些 Symbol 值可以让我们更好地理解和操作对象。
Symbol.iterator
Symbol.iterator 是一个用于定义可迭代对象的内置 Symbol 值。它可以让我们使用 for...of 循环来遍历对象。
-- -------------------- ---- ------- ----- --- - - ------------------ --------- -- - ----- -- ----- -- ----- -- - -- --- ------ ---- -- ---- - ------------------ -- -- -- - -
Symbol.toStringTag
Symbol.toStringTag 是一个用于定义对象的字符串描述的内置 Symbol 值。它可以让我们自定义对象的 toString 方法返回的字符串。
class MyClass { get [Symbol.toStringTag]() { return 'MyClass'; } } const obj = new MyClass(); console.log(obj.toString()); // [object MyClass]
Symbol.hasInstance
Symbol.hasInstance 是一个用于定义对象的 instanceof 运算符行为的内置 Symbol 值。它可以让我们自定义 instanceof 运算符的行为。
class MyClass { static [Symbol.hasInstance](instance) { return Array.isArray(instance); } } console.log([] instanceof MyClass); // true console.log({} instanceof MyClass); // false
总结
Symbol 是 ECMAScript 2019 中的一个新的原始数据类型,用于解决对象属性名冲突的问题。我们可以使用 Symbol 作为对象的属性名,并使用内置的 Symbol 值来操作对象。希望本文可以帮助你更好地理解和应用 Symbol。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/660bccd5d10417a222c050b5