前言
大多数时候,我们都使用的字符串作为对象属性,即使是使用数字,也会被自动转化为字符串类型。
let obj = {
0: "我是数字", // 0 等同于 "0"
true: true, // true 等同于 "true"
}
console.log(obj[0] === obj["0"]) // true
console.log(obj[true] === obj["true"]) // true
字符串类型的对象属性名很容易造成属性名冲突的问题。
比如在使用项目组其他成员封装的模块/对象,又想添加新的属性或者新的方法,这就容易使得新属性名与原有属性名冲突。如果有一种机制,保证每个属性的名字都是独一无二的就好了,这样就从根本上防止属性名的冲突。这就是ES6引入的Symbol的原因。
“Symbol
” 值表示唯一的标识符。
在对象中,Symbol
可以作为属性名。由于每个 Symbol
都是唯一的,因此可以确保属性名的唯一性,避免属性名冲突的问题。
Symbol
Symbol
是 JavaScript 中的一种新的基本数据类型,引入自 ECMAScript 6(ES6)标准。它是一种不可变且唯一的数据类型,可以用来创建独一无二的键(key)。
Symbol
的创建方式是通过调用全局的 Symbol()
函数来生成。每个通过 Symbol()
创建的 Symbol
值都是独一无二的,即使它们的描述符相同也不相等。
创建Symbol
let id = Symbol();
Symbol
的描述
// 添加symbol描述
let id1 = Symbol("id")
let id2 = Symbol("id")
console.log(id1 == id2) // false
// 获取Symbol描述
let des = id1.description
id1
和 id2
是两个描述相同的Symbol,但是它们不相等。
Symbol
保证是唯一的。即使创建了n个描述相同的Symbol
,它们的值也是不同的。描述只是一个标签,不影响Symbol
的值。
Symbol
不会自动转化为字符串
let id = Symbol("id");
alert(id); // 类型错误:无法将 symbol 值转换为字符串。
// Uncaught TypeError: Cannot convert a Symbol value to a string
alert(id.toString()); // Symbol(id)
console.log(id); // Symbol(id)
使用Symbol
作为对象属性名
const obj = {
};
const mySymbol = Symbol();
obj[mySymbol] = 'Symbol属性';
console.log(obj)
console.log(obj[mySymbol]); // 输出:Symbol属性
在对象中使用Symbol
,需要使用方括号[]
括起来。例如obj[mySymbol]
。
Symbol
在for...in
中会被跳过
let id = Symbol("id");
let user = {
name: "John",
age: 30,
[id]