介绍
Symbol 是 ECMAScript 6 引入的一种新类型。它是一种基本数据类型,类似于 Number 和 String。它的目的是创建一个不可变且唯一的标识符。
每个 Symbol 都是唯一的,且它们可以被用来作为对象属性的键。Symbol 的创建是通过Symbol()函数实现的。
在 ECMAScript 2021 中,Symbol 引入了一些新的方法,这些方法使得 Symbol 更加强大和有用。
新方法
Symbol.prototype.description
Symbol 通常被用来作为对象属性的键,但是它不能用来描述这个属性的作用。在 ECMAScript 2021 中,你可以通过访问 Symbol.prototype.description 来获取 Symbol 的描述。
示例代码:
const sym = Symbol('my symbol'); console.log(sym.description); // 输出 "my symbol"
Symbol.prototype.toStringTag
toStringTag 是一个内置 Symbol ,它被用来支持默认 Object.prototype.toString() 方法的自定义行为。通过设置 toStringTag ,你可以为一个对象定义自己的类型名称。在调用 Object.prototype.toString() 方法时,它会显示这个类型名称。
示例代码:
class Person { get [Symbol.toStringTag]() { return 'Person'; } } const me = new Person(); console.log(Object.prototype.toString.call(me)); // 输出 "[object Person]"
Symbol.matchAll
String.prototype.match() 方法和 RegExp.prototype.exec() 方法都只能匹配一次。Symbol.matchAll 可以用来获取一个正则表达式的全部匹配结果。
示例代码:
const regex = /t(e)(st(\d?))/g; const str = 'test1test2'; for (const match of str.matchAll(regex)) { console.log(match); }
Symbol.asyncIterator
Symbol.asyncIterator 是用来支持异步迭代器的内置 Symbol。这是在非同步上下文中迭代数据的协议。
示例代码:
-- -------------------- ---- ------- ----- ----------------- - - ----- ------------------------- - ----- -- ----- -- ----- -- - -- ------ -- -- - --- ----- ------ --- -- ------------------ - ----------------- - -----
Symbol.hasInstance
Symbol.hasInstance 用来支持自定义对象 instanceof 操作的行为。它接受一个单一参数,这个参数是待测试的值。
示例代码:
class MyArray { static [Symbol.hasInstance](obj) { return Array.isArray(obj); } } console.log([] instanceof MyArray); // 输出 true
结论
Symbol 作为 ECMAScript 的一个新类型,为程序员提供了一种不可变且唯一的标识符。而在 ECMAScript 2021 中,Symbol 新增的方法进一步增强了它的功能,如 Symbol.prototype.description、Symbol.prototype.toStringTag 等。这些方法使得 Symbol 更加强大和有用。
学习 Symbol 的应用可以让你更好地进行前端编程,同时,你也可以通过自己的代码来指导和启发其他的前端程序员。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/66f113a56fbf960197367e9e