面试官:ES6中为什么要使用Symbol?
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属性名 。

文章图片
【面试官:ES6中为什么要使用Symbol?】特性11:使用同一个Symbol值 , 可以使用Symbol.for 。 它接受一个字符串作为参数 , 然后搜索有没有以该参数作为名称的Symbol值 。 如果有 , 就返回这个Symbol值 , 否则就新建并返回一个以该字符串为名称的Symbol值 。

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

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

文章图片
这个时候 , 我们仅仅是想区分各种形状 , 因为不同的形状用不同的计算面积的公式 。 这里使用的是triangle的名字叫做‘Triangle’ , 而是事实上我们不想对triangle去特地取个名 , 我们只想要区分triangle这个形状不同于任何其他形状 , 那么这个时候Symbol就派上用场啦!
- 苹果|华为新一代“小方表”来了:Watch FIT 2正式官宣
- ZOL科技早餐:华为千元手表官宣,腾讯QQ回应大规模盗号
- 小米|小米12S系列官宣7月4日正式发布:小米与徕卡联合研发
- 华为|重磅级新品官宣:华为全屋智能2.0将于7月4日发布 前代39999元起
- 第四大运营商|第四大运营商登场!中国广电官网上线:开启选号
- 5G|中国广电官网上线 但不能选号 客服称内测尚未向公众开放
- 华为|长安华为打造, 鸿蒙系统加持!阿维塔11正式官宣,3.98秒破百!
- 小米科技|华为新机官宣!100W快充+6000万自拍+鸿蒙OS,7月4日发布
- realme|realme真我新旗舰正式官宣:带来颜值性能双巅峰,7月发
- 微信|微信官宣:新增2大重要新功能,1个好评如潮,1个遭网友集体吐槽
