在 ECMAScript 2019 中,Symbol 是一种新的原始数据类型。这种类型的主要作用是创建具有唯一性的对象标识符,以及提供一种新的方式定义对象属性。本文将介绍 Symbol 的特点、用法和实际应用。
Symbol 的特点
Symbol 是一种基本数据类型,使用 typeof 关键字可以得到 "symbol"。Symbol 值是不能被改变的,每个 Symbol 值都是唯一的。这意味着 Symbol 可以用作对象的标识符,因为两个 Symbol 值不可能相等。在一个程序中,多次调用 Symbol 函数返回的值也不会相等。
我们可以使用 Symbol 函数来创建一个新的 Symbol 对象。
const mySymbol = Symbol();
从上面的代码可以看到,通过 Symbol() 创建的 Symbol 对象是没有字面量表示的,只能通过 mySymbol.toString()
转化成字符串输出。
除了创建不同的标识符外,Symbol 还有以下几个特点:
- 在 for...in 循环或 Object.keys() 方法中不会出现 Symbol 类型的键名。
- Symbol 类型的键名不会被 json 序列化。
- Symbol.for() 可以共享 Symbol。
使用 Symbol 定义属性
ES6 引入了 let 和 const 用于定义变量,ES2019 引入了 Symbol 用于定义属性。在传统的对象中,属性的键值都是字符串类型。使用 Symbol 定义属性可以更好地标识属性,避免属性名冲突。
我们可以使用 Symbol() 创建一个新的 Symbol 属性,并通过对象字面量或 Object.defineProperty 方法定义该属性。
-- -------------------- ---- ------- ----- -------- - ------------------- ----- --- - - ----------- -------- -- --------------------------- -- ------- -------------------------- --------- - ------ --------------- --------- ----- --- --------------------------- -- --------------
在上面的示例代码中,我们创建了一个名为 mySymbol 的 Symbol 属性,然后将其作为对象 obj 的属性使用。我们还使用 Object.defineProperty 方法更改了 mySymbol 的值。
实际应用
Symbol 使用场景非常广泛,在实际应用开发中,Symbol 也有很多用处:
对象私有属性。
在 javascript 中没有私有属性一说,但是我们可以使用 Symbol 定义私有属性,其它开发人员就不会意外修改该属性值:
-- -------------------- ---- ------- ----- -------- - --------------------- ----- ------- - ------------------ - -------------- - ------ - ---------- - ------ --------------- - - ----- -------- - --- ----------- ------- -------- -------------------------------- -- ---- --------------------------------- -- --- ------- ------
枚举。
既然 Symbol 定义的属性不会出现在 for...in 循环中,那我们可以使用 Symbol 来定义一些枚举值。
const myEnum = { RED: Symbol('red'), GREEN: Symbol('green'), BLUE: Symbol('blue') }; console.log(myEnum.RED); // Symbol(red) console.log(myEnum.GREEN); // Symbol(green)
总结
Symbol 具有唯一性和不可遍历性,能够帮助开发人员更好地定义对象标识符和属性。在实际应用开发中,Symbol 也可以用来模拟私有属性和枚举。需要注意的是,由于 Symbol 的唯一性特性,需要格外小心处理共享 Symbol 对象的情况。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/651b6c1c95b1f8cacd315ef6