在 ES6 中引入了 Symbol 类型,它是一种新的基本数据类型,用来表示唯一的标识符,可以用作对象属性名。在 ES12 中,Symbol 类型得到了进一步增强和扩展,本文将详细介绍 ES12 中 Symbol 类型的新特性。
Symbol 作为私有属性
在 ES12 中,可以通过将 Symbol 作为对象的私有属性来创建私有属性。私有属性只能在对象内部访问到,外部无法访问,这提高了对象的安全性和稳定性。
示例代码:
// javascriptcn.com 代码示例 const obj = { [Symbol('name')]: 'Jack', [Symbol('age')]: 30, sayName() { console.log(this[Symbol('name')]); } }; obj.sayName(); // 输出:Jack console.log(obj[Symbol('age')]); // 输出:30
Symbol 作为 well-known symbol
ES6 引入了一些 well-known symbol,它们是一些预定义好的 Symbol 对象,可以用来扩展原生对象的行为。在 ES12 中,新增了一些 well-known symbol,用于扩展对象的功能。
Symbol.hasInstance
Symbol.hasInstance 用于自定义 instanceof 运算符的行为。当一个对象被 instanceof 运算符检查时,JavaScript 会调用这个对象的 Symbol.hasInstance 方法来判断该对象是否为某个构造函数的实例。
示例代码:
class MyArray { static [Symbol.hasInstance](instance) { return Array.isArray(instance); } } const arr = [1, 2, 3]; console.log(arr instanceof MyArray); // 输出:true
Symbol.matchAll
Symbol.matchAll 用于在字符串中查找所有匹配的正则表达式,返回一个迭代器。
示例代码:
// javascriptcn.com 代码示例 const str = 'Hello World'; const re = /l/g; for (const match of str.matchAll(re)) { console.log(match[0], match.index); } // 输出: // l 2 // l 3
Symbol.replaceAll
Symbol.replaceAll 用于在字符串中替换所有匹配的字符串。
示例代码:
const str = 'Hello World'; console.log(str.replaceAll('l', 'x')); // 输出:Hexxo Worxd
总结
Symbol 类型是 ES6 中新增的一种基本数据类型,并在 ES12 中得到了进一步增强和扩展,可以用作私有属性和 well-known symbol,扩展了对象的功能和行为。但需要注意的是,由于 Symbol 类型是唯一的,所以在使用时需要避免重复定义同名的 Symbol 对象。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65830c45d2f5e1655de13126