在 ES6 中,新增了一种基本数据类型 Symbol,这是一个独特的数据类型,用于表示独特的值。Symbol 的引入使得 JavaScript 中的变量命名空间更加安全,在库或者框架中的变量问题有一个良好的解决办法。本文将详细介绍Symbol的使用方法及其实际应用。
Symbol 的基础使用
通过调用 Symbol 构造函数创建 Symbol,Symbol 值是唯一的,它们的参数只是符号的描述。但是它们不是字符串,尽管看起来非常类似,但是两个 Symbol 在任何时候都不相等。举个例子:
let symbol1 = Symbol("apple"); let symbol2 = Symbol("apple"); console.log(symbol1 === symbol2); // false
创建 Symbol 值时,如果没有传入描述参数,Symbol 将会使用默认字符串作为描述。
let symbol3 = Symbol(); console.log(symbol3); // Symbol()
我们可以使用 for 方法获取全局 Symbol 注册表中已有的 Symbol,如果没有,就会在注册表中创建一个新的 Symbol。Symbol.toStringTag 属性值是“Symbol”:
let symbol4 = Symbol.for("pen"); let symbol5 = Symbol.for("pen"); console.log(symbol4 === symbol5); // true console.log(symbol4.toString()); // Symbol(pen) console.log(symbol4.toStringTag); // Symbol
Symbol 的应用
1. Symbol 应用于类似于私有属性的方式
JavaScript 没有真正的私有属性,因此开发者必须凭经验实现类似于私有属性的行为。在没有 Symbol 的时候,开发者可能会使用一个约定好的字符串前缀表示为私有属性,但是这样容易被访问或者覆盖。
使用 Symbol 作为属性名,这些属性不会意外覆盖,我们可以将这些属性视为类的私有属性,避免命名冲突。接下来看一个示例:
-- -------------------- ---- ------- --- ------- - --- -- - ----- --- - -------------- ----- ------- - ------------- - --------- - ----- -- - ------- ---------- - -------------------- - ------ ---------- - - ------ -------- ----- --- -------- - --- ---------- ------------------------------------------- -- ----- -- - ------- --------- --------------------------- -- ---------
在类的外部访问这个属性会返回 undefined,这相当于创建了一个私有属性。
2. Symbol 作为枚举值
Symbol 也可以用于定义枚举值,以取代常规枚举值,这将有益于解决这方面的一些问题,例如,常规枚举值容易被访问、破坏等。Symbol 保证了每个属性是唯一的,同时不受意外赋值和被破坏。举个例子:
const colors = { RED: Symbol("red"), GREEN: Symbol("green"), BLUE: Symbol("blue") }; console.log(colors.RED); // Symbol(red)
使用 Symbol 作为枚举值,避免了使用字符串或者数字类型时出现的问题。
3. Symbol 作为属性名在对象中的应用
Symbol 的一个非常好的特性是它可以作为对象的属性名使用,我们可以使用 Symbol 作为对象属性名,同时保证了属性在命名空间上的唯一性。这样就可以定义非常特别的属性,比如以下示例:
const mySymbol = Symbol(); const myObject = { [mySymbol]: "Hello Symbol!" }; console.log(myObject[mySymbol]); // Hello Symbol!
总结
在本文中我们学习了如何使用 Symbol 数据类型,以及它的实际应用。Symbol 可以在定义类的私有属性时使用,可以作为枚举值,避免了常规枚举值容易被访问、破坏的问题,还可以作为属性名使用,保证了在命名空间上的唯一性。Symbol 的引入为我们的 JavaScript 编程带来了更多选项和机会,这是一个非常有用的工具,需要我们在实际开发中深入理解并加以应用。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6491cd4648841e9894fcae18