在JavaScript中,Symbol是一种原始数据类型,用于创建唯一且不可变的值。
Symbol值是独一无二的,即使创建时使用相同的描述,每次创建的Symbol值也是不同的。这使得Symbol非常适合用作对象属性的标识符,可以防止属性名冲突。
以下是几个symbol数据类型的应用场景:
- 创建唯一的对象属性键:
const NAME = Symbol('name');
const obj = {};
obj[NAME] = 'John';
console.log(obj[NAME]); // 输出: John
- Symbol用作对象的私有成员:
const _name = Symbol('name');
const _age = Symbol('age');
class Person {
constructor(name, age) {
this[_name] = name;
this[_age] = age;
}
getInfo() {
return `${this[_name]} is ${this[_age]} years old.`;
}
}
const john = new Person('John', 30);
console.log(john.getInfo()); // 输出: John is 30 years old.
Symbol.for()
Symbol.for()
类似单例模式,首先会在全局搜索被登记的 Symbol 中是否有该字符串参数作为名称的 Symbol 值,如果有即返回该 Symbol 值,若没有则新建并返回一个以该字符串参数为名称的 Symbol 值,并登记在全局环境中供搜索。
let yellow = Symbol("Yellow");
let yellow1 = Symbol.for("Yellow");
yellow === yellow1; // false
let yellow2 = Symbol.for("Yellow");
yellow1 === yellow2; // true
Symbol.keyFor()
Symbol.keyFor()
返回一个已登记的 Symbol 类型值的 key ,用来检测该字符串参数作为名称的 Symbol 值是否已被登记。
let yellow1 = Symbol.for("Yellow");
Symbol.keyFor(yellow1); // "Yellow"