Symbol相关知识梳理
ES5 的对象属性名都是字符串,这容易造成属性名的冲突。
概述
ES6 引入了 种新的原始数据类型 Symbol ,表示独一无二 的值,Symbol是Js语言的第七种数据类型。
lets = Symbol();
typeof s
// ” symbol ”
Symbol 函数前不能使用 new 命令,否则会报错 这是因为生成的 Symbol 是一个原始类
型的值,不是对象 也就是说,由于 Symbol 值不是对象,所以不能添加属性 基本上,它是
一种类似于字符串的数据类型
Symbol 值不能与其他类型的值进行运算,否则会报错
由于每 Symbol 值都是不相等的,这意味着 Symbol 值可以作为标识符用于对象的属性名,保证不会出现同名的属性 这对于 个对象由 个模块构成的情况非常有用,能防止某个键被不小心 改写或覆盖。
Symbol 作为属性名,该属性不会出现在 for … in for … of 循环中,也不会被Object . keys ()、 Object.getOwnPropertyNames ()返回 。但它也不是私有属性,有一个Object .getOwnPropertySymbols 方法可以获取指定对象的所有 Symbol 属性名。
symbol.for()
有时,我们希望重新使用同一个 Symbol 值, Symbol.for 方法可以做到这一点。它接受
一个字符串作为参数,然后搜索有没有以该参数作为名称的 Symbol 值。如果有,就返回这个
Symbol 值,否则就新建井返回一个 以该字符串为名称的 Symbol 值。
Symbol . for ()与 Symbol ()这两种写法都会生成新的 Symbol 。它们的区别是,前者会
登记在全局环境中供搜索,而后者不会。 Symbol.for ()不会在每次调用时都返回 个新的
Symbol 类型的值,而是会先检查给定的 key 是否己经存在,如果不存在才会新建 个值
Symbol.for (”bar”) === Symbol . for (”bar”)
// true
Symbol (”bar”) === Symbol (”bar”)
// false
symbol…keyFor()
上面的代码中,由于 Symbol ()写法没有登记机制,所以每次调用都会返回 个不同的值。
Symbol.keyFor 方法返回一个己登记的 Symbol 类型值的 key
var sl = Symbol .for (” fo ”);
Symbol.keyFor(sl)// fo
var s2 = Symbol (” fo ”);
Symbol.keyFor(s2)// defined