扫码一下
查看教程更方便
ES6 引入了一种新的原始类型,称为 Symbol。 它们有助于在 JavaScript 程序中实现元编程。
const mySymbol = Symbol()
const mySymbol = Symbol(stringDescription)
Symbol 只是一块内存,我们可以在其中存储一些数据。 每个符号将指向不同的内存位置。 Symbol()
构造函数返回的值是唯一且不可变的。
让我们通过一个例子来理解这一点。 最初,我们创建了两个没有描述的 Symbol,然后创建了具有相同描述的 Symbol 。 在这两种情况下,比较Symbol时,相等运算符都将返回 false。
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)
上述代码的输出将如下所述
symbol
false
Symbol(hello)
Symbol(hello)
false
序号 | 属性 | 描述 |
---|---|---|
1 | Symbol.for(key) | 使用给定键在符号注册表中搜索现有符号,如果找到则返回它。 否则,将使用此键在全局符号注册表中创建一个新符号。 |
2 | Symbol.keyFor(sym) | 从给定符号的全局符号注册表中检索共享符号键。 |
Symbol 可以与类一起使用来定义类中的属性。 优点是,如果属性是一个符号,如下所示,只有在知道符号名称的情况下才能在包外访问该属性。 因此,当符号用作属性时,数据会被大量封装。
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)
// 仅当符号名称已知时才能访问属性
console.log(bike[COLOR])
上述代码的输出将如下所述
Bike {Symbol(): "red", Symbol(): "honda", Symbol(): "cbr"}
red