ECMAScript 2019 中你应该知道的 Symbol 与 Symbol 对象
在 ECMAScript 2019 中, Symbol 成为了一项新的特性,虽然 Symbol 的概念在 ES6 中就已经出现了,但它在 ES2019 中的更新彰显了其重要性。通过了解 Symbol 的使用方法以及 Symbol 对象,你可以更好地理解其在现代 JavaScript 开发中的威力。
Symbol 的定义
Symbol 是 ECMAScript 2015 引入的新的基本数据类型,它与其他基本数据类型不同,表示一个独一无二的值。Symbol 类型的定义及创建方式如下:
//创建一个新的 Symbol const mySymbol = Symbol('my description'); console.log(typeof mySymbol); // "symbol"
Symbol 可以被用作属性键,在对象字面量中使用 Symbol 作为键名时,需要使用 [ ] 操作符。Symbol 作为属性键具有唯一性,不会与其他属性冲突。如下所示:
const myObject = {}; const mySymbol = Symbol('my description'); const myValue = 'my value'; myObject[mySymbol] = myValue; console.log(myObject[mySymbol]); // "my value"
使用 Symbol 作为属性键时,属性名不可枚举,也就是不能被 for...in 循环获取到。如果需要获取 Symbol 属性,需要使用 Object.getOwnPropertySymbols() 方法。示例代码如下:
const myObject = {}; const mySymbol = Symbol('my description'); const myValue = 'my value'; myObject[mySymbol] = myValue; console.log(Object.getOwnPropertySymbols(myObject)); // [Symbol(my description)]
Symbol.for() 和 Symbol.keyFor()
Symbol.for() 方法和 Symbol.keyFor() 方法的功能比较相似,都是可用于对 Symbol 进行全局注册和检索。
Symbol.for() 方法可以将 Symbol 注册到全局 Symbol 注册表中,如果该 Symbol 已经在注册表中出现过,会直接返回它。示例代码如下:
const mySymbol = Symbol.for('mySymbol'); console.log(mySymbol === Symbol.for('mySymbol')); // true
Symbol.keyFor() 方法用于获取全局 Symbol 注册表中与 Symbol 有关的键名,如果没有找到该 Symbol,则返回 undefined。示例代码如下:
const mySymbol = Symbol.for('mySymbol'); console.log(Symbol.keyFor(mySymbol)); // "mySymbol"
Symbol 方法
在 Symbol 对象中,定义了一些方便操作 Symbol 的方法。
Symbol.hasInstance:该方法在检查某个对象是否是类的实例时被调用。
class MyClass { static [Symbol.hasInstance](instance) { return instance instanceof Array; } } console.log([] instanceof MyClass); // true
Symbol.isConcatSpreadable:用于确定对象是否可扩展到 array 中。
let arr1 = [1, 2, 3]; let arr2 = [4, 5, 6]; console.log(arr1.concat(arr2)); // [1, 2, 3, 4, 5, 6] arr2[Symbol.isConcatSpreadable] = false; console.log(arr1.concat(arr2)); // [1, 2, 3, [4, 5, 6]]
Symbol.match:用于确定一个输入字符串是否与正则表达式匹配。
-- -------------------- ---- ------- ----- -------- - ------------------- - ----------- - ------- - --------------------- - ------ ------------------------ - - ------------------ ---------------- -------------------- -- ----
Symbol.toPrimitive:用于转换对象为基本类型值。
-- -------------------- ---- ------- ----- ------------ - ------------------ - ---------- - ------ - -------------------------- - -- ----- --- --------- - ------ ----------- - ------ ----- - - ----- -------- - --- ----------------- -------------------- - --- -- --
Symbol.toStringTag:用于返回对象的字符串表示。
-- -------------------- ---- ------- ----- ------- - ----------------------- ------ --- ------ - - ----- -------- - --- ---------- ------------------------------------------------------ -- ------- -- ------
结论
通过了解 Symbol 与 Symbol 对象,我们可以更好地理解其在现代 JavaScript 开发中的重要性。Symbol 可以用作属性键名,保证属性的唯一性,可以通过 Symbol.for() 方法实现 Symbols 的全局注册,并且 Symbol 对象还定义了一些方便操作 Symbol 的方法。希望本文可以为你提供 Symbol 的一些学习及指导意义。
参考链接:
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Symbol
https://segmentfault.com/a/1190000023046329
https://juejin.cn/post/6844904114372126733
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/66fa4e68be3b1984ab6c13dd