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

ES6中为什么要使用Symbol?
1、简述ES6中Symbol的概念
ES6中已经有6种数据类型:
Undefined
Null
布尔值
字符串
数值
对象
但是在ES6种新加入一种新的数据类型Symbol 。
Symbol表示独一无二的值 。
面试官:ES6中为什么要使用Symbol?
文章图片
需要说明一下:这里的字符'saucxs'是该Symbol的一个描述 , 但是并非两个参数都是'saucxs' 。
2、简述Symbol的特性
特性1:Symbol值通过Symbol函数生成 , 使用typeof , 结果为"symbol"
面试官:ES6中为什么要使用Symbol?
文章图片
特性2:Symbol函数前不能使用new命令 , 否则会报错 。 这是因为生成的Symbol是一个原始类型的值 , 不是对象 。
特性3:instanceof的结果为false
面试官:ES6中为什么要使用Symbol?
文章图片
特性4:Symbol函数可以接受一个字符串作为参数 , 表示对Symbol实例的描述 , 主要是为了在控制台显示 , 或者转为字符串时 , 比较容易区分 。
面试官:ES6中为什么要使用Symbol?
文章图片
特性5:如果Symbol的参数是一个对象 , 就会调用该对象的toString方法 , 将其转为字符串 , 然后才生成一个Symbol值 。
面试官:ES6中为什么要使用Symbol?
文章图片
特性6:Symbol函数的参数只是表示对当前Symbol值的描述 , 相同参数的Symbol函数的返回值是不相等的 。
面试官:ES6中为什么要使用Symbol?
文章图片
特性7:Symbol值不能与其他类型的值进行运算 , 会报错 。
面试官:ES6中为什么要使用Symbol?
文章图片
特性8:Symbol值可以显式转为字符串 。
面试官:ES6中为什么要使用Symbol?
文章图片
特性9:Symbol值可以作为标识符 , 用于对象的属性名 , 可以保证不会出现同名的属性 。
面试官:ES6中为什么要使用Symbol?
文章图片
特性10:Symbol作为属性名 , 该属性不会出现在for...in、for...of循环中 , 也不会被Object.keys()、Object.getOwnPropertyNames()、JSON.stringify()返回 。 但是 , 它也不是私有属性 , 有一个Object.getOwnPropertySymbols方法 , 可以获取指定对象的所有Symbol属性名 。
面试官:ES6中为什么要使用Symbol?
文章图片
面试官:ES6中为什么要使用Symbol?】特性11:使用同一个Symbol值 , 可以使用Symbol.for 。 它接受一个字符串作为参数 , 然后搜索有没有以该参数作为名称的Symbol值 。 如果有 , 就返回这个Symbol值 , 否则就新建并返回一个以该字符串为名称的Symbol值 。
面试官:ES6中为什么要使用Symbol?
文章图片
特性12:Symbol.keyFor方法返回一个已登记的Symbol类型值的key 。
面试官:ES6中为什么要使用Symbol?
文章图片
3、为什么要使用Symbol?
比如有这样一种场景 , 我们想区分两个属性 , 其实我们并不在意 , 这两个属性值究竟是什么 , 我们在意的是 , 这两个属性绝对要区分开来!例如:
面试官:ES6中为什么要使用Symbol?
文章图片
这个时候 , 我们仅仅是想区分各种形状 , 因为不同的形状用不同的计算面积的公式 。 这里使用的是triangle的名字叫做‘Triangle’ , 而是事实上我们不想对triangle去特地取个名 , 我们只想要区分triangle这个形状不同于任何其他形状 , 那么这个时候Symbol就派上用场啦!