JavaScript系列之基本数据类型Symbol


一、什么是Symbol

Symbol是ES6中新增的一种数据类型,被划分到了基本数据类型中
基本数据类型:字符串、数值、布尔、undefined、null、Symbol
引用数据类型:Object

二、构造函数

Symbol() 构造函数返回一个 symbol 类型的值,但是它并不完全支持构造函数的语法,因为它不支持 new Symbol() 语法,也无法被子类化。它可以作为 class 定义中 extends 子句的值使用,但对它进行 super 调用将会导致异常。

1、语法

Symbol();
Symbol(description);

2、参数

  • description【可选】

一个字符串,用来表示 symbol 的描述,可以用于调试,但不能直接访问 symbol 自身。

3、返回值

返回一个 symbol 类型的值

4、示例

4.1、创建Symbol

要创建一个新的原始 symbol,你可以传递一个可选的字符串作为 description 参数来创建 Symbol():

const sym1 = Symbol();
const sym2 = Symbol("FELaoL");
const sym3 = Symbol("FELaoL");

上面的代码创建了三个新的 symbol,注意 Symbol(“FELaoL”) 不会将字符串 “FELaoL” 强制转换成 symbol,而是每次总是创建一个新的 symbol:

Symbol("FELaoL") === Symbol("FELaoL"); // false

4.2、new Symbol

下面带有 new 运算符的语法将会抛出一个 TypeError:

const sym = new Symbol(); // Uncaught TypeError: Symbol is not a constructor

这一限制是为了防止开发人员创建一个显式的 Symbol 包装对象,而不是一个新的 symbol 值。

三、实例属性

1、description

description 是一个只读属性,它会返回 Symbol 对象的可选描述的字符串。

1.1、语法

Symbol("myDescription").description;
Symbol.iterator.description;
Symbol.for("foo").description;

1.2、栗子

Symbol("desc").toString(); // "Symbol(desc)"
Symbol("desc").description; // "desc"
Symbol("").description; // ""
Symbol().description; // undefined

// 内置通用(well-known)symbol
Symbol.iterator.toString(); // "Symbol(Symbol.iterator)"
Symbol.iterator.description; // "Symbol.iterator"

// global symbols
Symbol.for("foo").toString(); // "Symbol(foo)"
Symbol.for("foo").description; // "foo"

1.3、toString()与description的区别

description 属性可以用于读取该描述。与 toString() 不同的是它不会包含 "Symbol()" 的字符串。

四、实例方法

1、toString()

1.1、概述

toString() 方法返回当前 symbol 对象的字符串表示。

1.2、语法

symbol.toString();

1.3、symbol 原始值不能转换为字符串

symbol 原始值不能转换为字符串,所以只能先转换成它的包装对象,再调用 toString() 方法:

Symbol("foo") + "bar";
// Uncaught TypeError: Cannot convert a Symbol value to a string
Symbol("foo").toString() + "bar";
// "Symbol(foo)bar",就相当于下面的:
Object(Symbol("foo")).toString() + "bar";
// "Symbol(foo)bar"

2、valueOf()

2.1、概述

valueOf() 方法返回当前 symbol 对象所包含的 symbol 原始值。

2.2、语法

symbol.valueOf();

2.3、栗子

在 JavaScript 中,虽然大多数类型的对象在某些操作下都会自动的隐式调用自身的 valueOf() 方法或者 toString() 方法来将自己转换成一个原始值,但 symbol 对象不会这么干,symbol 对象无法隐式转换成对应的原始值

Object(Symbol("foo")) + "bar";
// TypeError: Cannot convert a Symbol value to a string
// 无法隐式的调用 valueOf() 方法

Object(Symbol("foo")).valueOf() + "bar";
// TypeError: Cannot convert a Symbol value to a string
// 手动调用 valueOf() 方法,虽然转换成了原始值,但 symbol 原始值不能转换为字符串

Object(Symbol("foo")).toString() + "bar";
// "Symbol(foo)bar",需要手动调用 toString() 方法才行

写在最后

如果你感觉文章不咋地//(ㄒoㄒ)//,就在评论处留言,作者继续改进;o_O???
如果你觉得该文章有一点点用处,可以给作者点个赞;\\*^o^*//
如果你想要和作者一起进步,可以微信扫描二维码,关注前端老L~~~///(^v^)\\\~~~
谢谢各位读者们啦(^_^)∠※!!!

猜你喜欢

转载自blog.csdn.net/weixin_62277266/article/details/128841138