Symbol 是一种基本数据类型,用于表示唯一的标识符。Symbol 值是不可变且唯一的,可以用作对象的属性名,以确保属性名的唯一性。
Symbol 值通过 Symbol()
函数创建,每次调用该函数都会返回一个全新且唯一的 Symbol 值。例如:
const symbol1 = Symbol();
const symbol2 = Symbol();
console.log(symbol1 === symbol2); // false,每次调用 Symbol() 都会返回不同的值
Symbol 值通常用作对象的属性名,以避免命名冲突。由于 Symbol 值是唯一的,因此它们不会与其他属性名产生冲突。例如:
const obj = {
[Symbol("key")]: "value"
};
console.log(obj[Symbol("key")]); // undefined,使用不同的 Symbol 值无法获取到属性值
console.log(obj[Object.getOwnPropertySymbols(obj)[0]]); // "value",通过获取 Symbol 属性键来访问属性值
Symbol 还可以接受一个可选的描述字符串作为参数,用于标识 Symbol 的用途或含义。但是,描述字符串并不影响 Symbol 的唯一性,仅用于调试和识别目的。
需要注意的是,由于 Symbol 值的唯一性特性,它们在进行相等性比较时始终返回 false。即使两个 Symbol 值的描述字符串相同,它们仍然是不相等的。
看到了这里还是觉得有些迷糊?我们继续
当我们提到 Symbol 时,它主要有两个特点:唯一性和不可变性。
-
唯一性:每个通过
Symbol()
创建的 Symbol 值都是唯一的,即使两个 Symbol 值的描述字符串相同,它们仍然是不相等的。这意味着可以将 Symbol 值用作对象属性名,确保属性名的唯一性,避免命名冲突。
const symbol1 = Symbol("key");
const symbol2 = Symbol("key");
console.log(symbol1 === symbol2); // false,Symbol 值是不相等的
const obj = {
[symbol1]: "value"
};
console.log(obj[symbol1]); // "value"
console.log(obj[symbol2]); // undefined,使用不同的 Symbol 值无法获取到属性值
2. 不可变性:一旦创建了 Symbol 值,就无法修改它们的值或重新赋值。这意味着 Symbol 值是不可变的。这与字符串或数字等可改变的数据类型不同。
const symbol = Symbol("key");
// 尝试修改 Symbol 值
symbol = Symbol("newKey"); // 报错,无法重新赋值 Symbol 值
// 尝试修改 Symbol 值的描述字符串
symbol.description = "newDescription"; // 报错,无法修改描述字符串
Symbol 还具有以下特性:
- Symbol 值可以作为对象的属性名,以确保属性名的唯一性。
- 使用
Object.getOwnPropertySymbols()
方法可以获取一个对象的所有 Symbol 属性键。 - Symbol 值可以用作常量,因为每个 Symbol 值都是唯一的,不会与其他值相等。
需要注意的是,Symbol 值不是完全私有的。使用 Object.getOwnPropertySymbols()
或 Reflect.ownKeys()
可以获取到一个对象的 Symbol 属性键。但是,由于 Symbol 值的唯一性,其他代码很难意外覆盖或访问特定的 Symbol 属性。