JavaScript其实还有一种基本数据类型你知道吗?Symbol 是什么意思?Symbol是什么?一篇文章弄懂

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 时,它主要有两个特点:唯一性和不可变性。

  1. 唯一性:每个通过 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 属性。

  • 14
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝斑.json

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值