Symbols 是 ECMAScript 2015 (ES6) 新增的基本数据类型之一,它可以创建一个唯一的、不可变的值,用于在对象中创建唯一的属性。在 ECMAScript 2021 (ES12) 中,Symbols 的使用也得到了进一步改进,本文将介绍如何使用 Symbols 创建唯一的对象属性。
什么是 Symbols?
Symbol 是 ECMAScript 中的一种新的原始数据类型,它可以用来创建一个唯一的、不可变的值。每一个使用 Symbol 创建的值都是唯一的,即使两个使用相同描述的 Symbol,它们也是不相等的。用来创建 Symbol 值的函数是 Symbol()
。
const s1 = Symbol(); // 创建一个空的 Symbol 值 const s2 = Symbol("描述"); // 创建一个带有描述的 Symbol 值
上面的代码中,s1
和 s2
分别是两个不同的 Symbol 值,它们之间是不相等的。
创建唯一的对象属性
在 ECMAScript 中,对象的属性名可以是字符串或者数字。但是,属性名只能是唯一的,并且字符串属性名存在被意外覆盖的风险,比如在模块中引入同名的模块会影响全局变量。
为了解决这个问题,ES6 引入了 Symbols,可以用来创建唯一的属性名,避免了属性名冲突的问题。在 ES12 中,Symbol 的使用再次得到了升级,可以使用 Symbols 创建唯一的对象属性。
-- -------------------- ---- ------- ----- ---- - --------------- ----- ------ - - ------- ----- ---- --- ------- ---- -- -------------------------- -- ---- ------------------------ -- -- --------------------------- -- ---
上面的代码中,name
是一个作为对象属性名的 Symbol 值,它的描述是 "name"。通过使用这个 Symbol 值可以为 person
对象创建唯一的属性名,避免了属性名冲突的问题。
需要注意的是,在使用 Symbols 为对象创建属性时,必须使用方括号语法,否则对象属性名将被解析成字符串。
Symbols 的应用场景
除了创建唯一的对象属性,Symbols 还有很多其他的应用场景。下面列举一些常见的使用场景。
1. 防止属性名冲突
Symbols 可以用来创建唯一的属性名,保证属性名不会冲突。
const MODULE_NAME = Symbol("MODULE_NAME"); const module1 = {}; module1[MODULE_NAME] = "module1"; const module2 = {}; module2[MODULE_NAME] = "module2"; console.log(module1[MODULE_NAME]); // "module1" console.log(module2[MODULE_NAME]); // "module2"
2. 封装类的方法和属性
Symbols 可以用来封装类的方法和属性,避免属性和方法名被意外覆盖。
-- -------------------- ---- ------- ----- ----- - --------------- ----- ---- - -------------- ----- ------ - ----------------- ---- - ----------- - ----- ---------- - ---- - --- ------ - ------ ------------ - --- ---------- - -- ------- ----- --- -------- -- ----- - - -- ----- - ---- - ---------- - ------ - ---- - ----- --- -------------- --- -------- - - --- ----- - ------ ----------- - - ----- ------ - --- ------------ ---- ------------------------- -- ---- ------------------------ -- -- ---------- - --- ------------------------ -- -- ---------- - ---- -- ----
在上面的代码中,_name
和 _age
都是作为 Person 类的私有属性,使用 Symbols 可以保证它们不会被意外覆盖。
3. 枚举对象的属性
Symbols 可以用来枚举对象的属性,避免了一些方法被意外调用。
-- -------------------- ---- ------- ----- --- - - ----- ----- ---- --- ------------------- ---- -- ------------------------------ -- -------- ------ -------------------------------- -- ------ --- --------------------------------- -- --------- ------ ------- ---- ---------------------------------- -- -------- ------ ---------------
在上面的代码中,Object.keys()
、Object.values()
和 Object.entries()
方法都无法获取到 Symbol 属性。Reflect.ownKeys()
方法可以获取到所有属性名,包括 Symbol 属性。
总结
本文介绍了如何使用 Symbols 创建唯一的对象属性,在 ES12 中 Symbols 的使用也得到了进一步改进。除了创建唯一的对象属性,Symbols 还有很多其他的应用场景,如防止属性名冲突、封装类的方法和属性、枚举对象的属性等。在实际开发中,应根据具体场景灵活使用 Symbols。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64cf0a5bb5eee0b5256862c0