面试官:ES6中为什么要使用Symbol?

[复制链接]
作者: zhaoyuac09 | 时间: 2022-6-24 01:19:56 | 其他|
0 40

747

主题

747

帖子

2241

积分

高中生

Rank: 6Rank: 6

积分
2241
发表于 2022-6-24 01:19:56| 显示全部楼层 |阅读模式
ES6中为什么要使用Symbol?
1、简述ES6中Symbol的概念
ES6中已经有6种数据类型:
Undefined
Null
布尔值
字符串
数值
对象
但是在ES6种新加入一种新的数据类型Symbol。
Symbol表示独一无二的值。

需要说明一下:这里的字符'saucxs'是该Symbol的一个描述,但是并非两个参数都是'saucxs'。
2、简述Symbol的特性
特性1:Symbol 值通过 Symbol 函数生成,使用 typeof,结果为 "symbol"

特性2:Symbol 函数前不能使用 new 命令,否则会报错。这是因为生成的 Symbol 是一个原始类型的值,不是对象。
特性3:instanceof 的结果为 false

特性4:Symbol 函数可以接受一个字符串作为参数,表示对 Symbol 实例的描述,主要是为了在控制台显示,或者转为字符串时,比较容易区分。

特性5:如果 Symbol 的参数是一个对象,就会调用该对象的 toString 方法,将其转为字符串,然后才生成一个 Symbol 值。

特性6:Symbol 函数的参数只是表示对当前 Symbol 值的描述,相同参数的 Symbol 函数的返回值是不相等的。

特性7:Symbol 值不能与其他类型的值进行运算,会报错。

特性8:Symbol 值可以显式转为字符串。

特性9:Symbol 值可以作为标识符,用于对象的属性名,可以保证不会出现同名的属性。

特性10:Symbol 作为属性名,该属性不会出现在 for...in、for...of 循环中,也不会被 Object.keys()、Object.getOwnPropertyNames()、JSON.stringify() 返回。但是,它也不是私有属性,有一个 Object.getOwnPropertySymbols 方法,可以获取指定对象的所有 Symbol 属性名。

特性11:使用同一个 Symbol 值,可以使用 Symbol.for。它接受一个字符串作为参数,然后搜索有没有以该参数作为名称的 Symbol 值。如果有,就返回这个 Symbol 值,否则就新建并返回一个以该字符串为名称的 Symbol 值。

特性12: Symbol.keyFor 方法返回一个已登记的 Symbol 类型值的 key。

3、为什么要使用Symbol?
比如有这样一种场景,我们想区分两个属性,其实我们并不在意,这两个属性值究竟是什么,我们在意的是,这两个属性绝对要区分开来! 例如:

这个时候,我们仅仅是想区分各种形状,因为不同的形状用不同的计算面积的公式。 这里使用的是triangle的名字叫做‘Triangle’,而是事实上我们不想对triangle去特地取个名,我们只想要区分triangle这个形状不同于任何其他形状,那么这个时候Symbol就派上用场啦!

也就是说,我们不用非要去给变量赋一个字符串的值,去区分它和别的变量的值不同,因为去给每个变量取个语义化而又不同的值是一件伤脑子的事,当我们只需要知道每个变量的值都是百分百不同的即可,这时候我们就可以用Symbol。
还有可以运用在类的私有变量和私有方法中。
福利
需要更多前端资料,面试资料的私信发送面试获取



来源:
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回列表 返回顶部