什么是 Symbol?
Symbol 是 ECMAScript 2015 引入的一种新的原始类型,它是一种唯一且不可变的数据类型。每个 Symbol 值都是独一无二的,它们被用作对象属性的标识符(key)。
与字符串(String)或数字(Number)等原始类型不同,Symbol 值在 JavaScript 程序中是不可变的,这意味着不能改变或修改 Symbol。
在定义 Symbol 时,我们可以给它一个描述性的字符串作为参数,但这个字符串并不唯一,并不影响 Symbol 的独一无二性。
const symbol1 = Symbol('description'); const symbol2 = Symbol('description'); // symbol1 and symbol2 为两个独立的唯一 Symbol 值 console.log(symbol1 === symbol2); // false
Symbol 的应用场景
防止属性名冲突
当我们在写代码的时候,时常会遇到命名冲突的问题,比如两个模块都定义了同名的属性,这时就需要使用 Symbol 来解决冲突问题。
const KEY = Symbol('my_key'); const obj = {}; obj[KEY] = 'value'; // 打印出对象所有自身属性名和属性值 console.log(Object.getOwnPropertyNames(obj)); console.log(Object.getOwnPropertySymbols(obj));
使用 Symbol 作为常量
有时候我们需要定义一些常量,这时定义一个 Symbol 值是一个好办法。因为 Symbol 值不会重复,所以 Symbol 常量通常被用来定义程序内部的私有事件名称、状态类型等。
-- -------------------- ---- ------- ----- --------- - --------------- ----- ----------------- - ------------- -------- ----------------- - -- ----- --- ------- - ------ ---------- - ---- -- ----- --- ----- ---- -- --- ------ - ------ ------------------ - -
创建私有属性
因为 Symbol 的独一无二性,我们可以利用它去创建私有变量或私有属性,这种使用方式虽然无法绝对保护私有属性,但是可以在某种程度上提高私有性。
迭代器的实现
Symbol 还可以用于定义对象的迭代器。在迭代对象的时候,对象会首先去查找对象上是否有可迭代的 Symbol.iterator 属性,如果有该属性,则使用 Iterator,否则会使用 for ... in 循环。
-- -------------------- ---- ------- ----- --- - - -- ---- -- ---- -- --- -- -------------------- - ---------- - --- ---- - ------------------ --- ----- - -- ------ - ----- -- -- - ------ - ------ -------------------- ----- ----- - ----------- -- - -- -- --- ---- ----- -- ---- - ------------------- -
总结
Symbol 是 ECMAScript 2015 中的新特性,与其他原始类型不同的是,每个 Symbol 值都是唯一的、不可变的。Symbol 的应用场景包括防止属性名冲突、作为常量、创建私有属性和迭代器的实现等。它的独一无二性使得它在 JavaScript 程序中有很多强大的应用场景,开发者们可以根据实际需求灵活运用。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64f58b42f6b2d6eab3e4b100