// Here are two symbols with the same description:
console.log(Sym1===Sym2)// returns "false"// Symbols are guaranteed to be unique.// Even if we create many symbols with the same description,// they are different values.
Symbol 是一种解决命名冲突的工具。试想我们以前定义一个对象方法的时候总是要检查是否已存在同名变量:
可是这样写,即便已存在同名方法,但他们实现的功能不一定一样,而且函数的接口也不一定适合自己。这样我们就不得不再给自己的函数起个其他的名字,可以万一又存在呢?
于是引入了 Symol,用来产生一个全局唯一的标识符,你可以放心的使用它。
它接受一个字符串参数,作为该标识符的描述:
描述符是用来帮助开发人员区别不同是 symbol,不具备其他意义, 所以 symbol 值只有 toString() 和 valueOf() 方法。
Symbol 作为一个基本类型存在于 js 中。这样,js 就有了6个基本类型: null , undefined , Boolean , Number , String , Symbol 和1个复杂类型: Object
使用 Symbol 需要注意以下几点:
这个应该不陌生了,和普通标识符用法类似,只是不能使用 . 访问和定义,必须使用 [] :
当然也可以定义一些常量,就像英语中 Symbol 代表一种象征,一个符号:
需要注意,Symbol 属性只有 Object.getOwnPropertySymbols(obj) 和 Reflect.ownKey(obj) 可以遍历到:
我们可以利用这个方法,构造一些非私有的内部变量:
注意 Symbol 的登记是全局的:
ES6 提供了12个内置的 Symbol 值,这12个值,都是对象的,且都不可枚举、不可配置、不可修改。因为它们具有其特殊意义:
对于一个类而言,该属性必须返回 boolean 类型
ES6 新增的 Symbol.toStringTag 如下: