文章の目录
一、什么是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^)\\\~~~
谢谢各位读者们啦(^_^)∠※
!!!