ES6 - Symbol(符号)



Symbol(符号)简介

ES6 引入了一种新的原始数据类型:Symbol。它们有助于在 JavaScript 程序中实现元编程。

语法

const mySymbol = Symbol()
const mySymbol = Symbol(stringDescription)

Symbol 只是可以存储一些数据的内存块。每个 Symbol 都指向不同的内存位置。Symbol() 构造函数返回的值是唯一且不可变的。

示例

让我们通过一个例子来理解这一点。首先,我们创建了两个没有描述的符号,然后是具有相同描述的符号。在这两种情况下,当比较符号时,相等运算符都将返回 false。

<script>
   const s1 = Symbol();
   const s2 = Symbol();
   console.log(typeof s1)
   console.log(s1===s2)
   const s3 = Symbol("hello");//description
   const s4 = Symbol("hello");
   console.log(s3)
   console.log(s4)
   console.log(s3==s4)
</script>

以上代码的输出如下所示:

symbol
false
Symbol(hello)
Symbol(hello)
false
序号 属性和描述
1 Symbol.for(key)

在符号注册表中搜索具有给定键的现有符号,如果找到则返回它。否则,将使用此键在全局符号注册表中创建一个新的符号。

2 Symbol.keyFor(sym)

从全局符号注册表中检索给定符号的共享符号键。

Symbol 和类

Symbol 可与类一起使用来定义类中的属性。其优点是,如果属性是如下所示的 Symbol,则只有在知道 Symbol 名称的情况下才能在包外访问该属性。因此,当使用 Symbol 作为属性时,数据更加封装。

示例

<script>
   const COLOR = Symbol()
   const MODEL = Symbol()
   const MAKE = Symbol()
   class Bike {
      constructor(color ,make,model){
      this[COLOR] = color;
      this[MAKE] = make;
      this[MODEL] = model;
   }
}
let bike = new Bike('red','honda','cbr')
console.log(bike)
//property can be accessed ony if symbol name is known
console.log(bike[COLOR])
</script>

以上代码的输出如下所示:

Bike {Symbol(): "red", Symbol(): "honda", Symbol(): "cbr"}
red
广告