在 ECMAScript 2015(ES6)中,Symbol 是一种新的原始数据类型,它可以用来创建唯一的标识符,从而避免名称冲突。在 ECMAScript 2021(ES12)中,Symbol 有了更多的用途和扩展,本文将介绍 Symbol 的使用方法和示例代码。
创建 Symbol
创建 Symbol 可以使用全局的 Symbol 函数,它可以接受一个可选的参数,用于描述 Symbol,这个描述只是一个字符串,用于调试和诊断。
const symbol1 = Symbol(); const symbol2 = Symbol('description');
上面的代码创建了两个不同的 Symbol,第二个 Symbol 有一个描述。
Symbol 作为对象属性名
Symbol 可以作为对象的属性名,这样可以避免属性名冲突。使用 Symbol 作为属性名时,需要使用方括号语法。
const obj = {}; const symbol = Symbol('description'); obj[symbol] = 'value'; console.log(obj[symbol]); // 'value'
上面的代码创建了一个对象,并使用 Symbol 作为属性名,然后设置了属性值。使用方括号语法获取属性值时,也需要使用 Symbol。
内置 Symbol
ES6 中有一些内置的 Symbol,比如 Symbol.iterator,用于指定对象的默认迭代器。ES12 中新增了一些内置的 Symbol。
Symbol.matchAll
Symbol.matchAll 用于指定一个正则表达式的全局匹配器,它返回一个迭代器,可以迭代出所有匹配结果。
const str = 'hello world'; const regex = /l/g; const matches = str.matchAll(regex); for (const match of matches) { console.log(match); }
上面的代码使用 Symbol.matchAll 获取字符串中所有的 l。
Symbol.asyncIterator
Symbol.asyncIterator 用于指定对象的异步迭代器,它返回一个异步迭代器,可以迭代出所有的异步结果。
-- -------------------- ---- ------- ----- ------------- - - ----- ------------------------- - ----- -- ----- -- ----- -- - -- ------ ---------- - --- ----- ------ --- -- -------------- - ----------------- - -----
上面的代码创建了一个异步可迭代对象,并使用 Symbol.asyncIterator 指定了异步迭代器。然后使用 for await...of 循环异步迭代对象。
Symbol.hasInstance
Symbol.hasInstance 用于指定一个函数的 instanceof 运算符行为。它接受一个参数,表示被检查的对象。
class MyNumber { static [Symbol.hasInstance](obj) { return typeof obj === 'number'; } } console.log(1 instanceof MyNumber); // true console.log('hello' instanceof MyNumber); // false
上面的代码创建了一个类,并使用 Symbol.hasInstance 指定了 instanceof 运算符行为。
Symbol 属性描述符
ES6 中有一些属性描述符,比如 writable、enumerable、configurable 等。ES12 中新增了一些属性描述符,用于 Symbol 属性。
Symbol.toStringTag
Symbol.toStringTag 用于指定一个对象的 toString 方法返回的字符串。
class MyObj { get [Symbol.toStringTag]() { return 'MyObject'; } } const obj = new MyObj(); console.log(obj.toString()); // '[object MyObject]'
上面的代码创建了一个类,并使用 Symbol.toStringTag 指定了 toString 方法返回的字符串。
Symbol.unscopables
Symbol.unscopables 用于指定一个对象的 with 语句中被排除的属性。
-- -------------------- ---- ------- ----- --- - - -- -- -- -- --------------------- - -- ---- - -- ---- ----- - --------------- -- - --------------- -- --------------- - -- --- ------- -
上面的代码创建了一个对象,并使用 Symbol.unscopables 指定了 with 语句中被排除的属性。
总结
Symbol 是一种新的原始数据类型,它可以用来创建唯一的标识符,避免名称冲突。ES12 中 Symbol 有了更多的用途和扩展,比如作为对象属性名、内置 Symbol、Symbol 属性描述符等。使用 Symbol 可以让代码更加简洁和可读。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/65d5cf91add4f0e0ffd76318