Symbol 是 ECMAScript 2015 标准引入的第七种数据类型,是一种新的原始数据类型,用于创建独一无二的、不可变的值。在 ES10 中,Symbol 得到了进一步的规范和扩展,成为了 JavaScript 中一个非常重要的特性。
什么是 Symbol?
Symbol 可以理解为一种新的原始数据类型,它的值是唯一的且不可变的。用 Symbol 函数可以创建一个 Symbol 值,例如:
const sym = Symbol();
Symbol 值可以作为对象的属性名使用,例如:
const mySymbol = Symbol('mySymbol'); const myObj = {}; myObj[mySymbol] = 'value'; console.log(myObj[mySymbol]); // "value"
注意,使用 Symbol 定义的属性名是没有被枚举的,因此不会出现在 for...in 循环、Object.keys()、Object.getOwnPropertyNames() 等方法的返回结果中。
在 ES10 中,Symbol 得到了进一步的规范和扩展,以下是 ES10 中新增的 Symbol 方法:
1. Symbol.prototype.description
description 属性是 Symbol 实例的一个只读的字符串属性,表示 Symbol 值的描述,例如:
const mySymbol = Symbol('mySymbol'); console.log(mySymbol.description); // "mySymbol"
2. Symbol.asyncIterator
asyncIterator 方法返回对象的默认异步迭代器,该方法可被使用 for-await-of 循环语句访问。例如:
-- -------------------- ---- ------- ----- ----- - - ----------------------- ----- --------- -- - ----- ------------------------- ----- ------------------------- - -- ------ -------- -- - --- ----- ------ - -- ------ - --------------- - -----
3. Symbol.hasInstance
hasInstance 方法是一个方法,用于确定对象的构造函数是否为某个对象的构造函数的实例,例如:
class Foo {} const myFoo = new Foo(); console.log(Foo[Symbol.hasInstance](myFoo)); // true
4. Symbol.isConcatSpreadable
isConcatSpreadable 方法是一个布尔值,表示对象是否应该展开以进行数组连接,默认值为 undefined。
let arr1 = [1, 2]; let arr2 = [3, 4]; console.log(arr1.concat(arr2)); // [1, 2, 3, 4] arr1[Symbol.isConcatSpreadable] = false; console.log(arr1.concat(arr2)); // [[1, 2], 3, 4]
5. Symbol.match
match 方法用于模式匹配,例如:
const regexp = /hello/; console.log(regexp[Symbol.match]('hello world')); // true
6. Symbol.matchAll
matchAll 方法返回一个迭代器,包含字符串中与正则表达式匹配的所有结果。
-- -------------------- ---- ------- ----- ------ - --------- ----- --- - ------ ---------- ------- ----- ------- - --------------------- --- ------ ----- -- -------- - ------------------- -
7. Symbol.replace
replace 方法是字符串的正则匹配替换功能的内部实现,其行为类似于 String.prototype.replace()。
const regexp = /hello/; console.log('hello world'.replace(regexp, 'hi')); // "hi world"
8. Symbol.search
search 方法是在字符串中搜索与正则表达式匹配的位置的内部实现,其行为类似于 String.prototype.search()。
const regexp = /hello/; console.log('hello world'.search(regexp)); // 0
9. Symbol.species
species 方法返回一个构造函数,该构造函数由该对象的派生对象用来创建新的实例对象。例如:
-- -------------------- ---- ------- ----- ------- ------- ----- - ------ --- ------------------ - ------ ------ - - ----- ------- - --- ---------- ------------------- ---------- --------- -- ---- ------------------- ---------- ------- -- ---- ----- -------- - ---------------- -------------------- ---------- --------- -- ----- -------------------- ---------- ------- -- ----
10. Symbol.split
split 方法是字符串分割功能的内部实现,其行为类似于 String.prototype.split()。
const regexp = /hello/; console.log('hello world'.split(regexp)); // ["", " world"]
总结
Symbol 是一个非常重要的特性,它能够创建独一无二的、不可变的值。在 ES10 中,Symbol 得到了进一步的规范和扩展,我们可以通过 Symbol 的各种方法来扩展它的功能,提高 JavaScript 编程效率和代码质量。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6469b93e968c7c53b098f903