概述
ES6 引入了一种新的原始数据类型 Symbol,表示独一无二的值。它是 JavaScript 语言的第七种数据类型, 前六种是: undefined 、 null 、布尔值(Boolean)、字符串(String)、数值(Number)、对象(Object)。
- 对象的属性名现在可以有两种类型:字符串和 Symbol 类型
- Symbol 函数前不能使用 new 命令
- Symbol 函数接受一个字符串作为参数表示 Symbol 实例的描述
- 如果参数是一个对象就会调用该对象的 toString 方法将其转为字符串然后生成一个 Symbol 值
- Symbol 值不能与其他的类型的值进行运算,会报错
- Symbol 值可以显示的转为字符串和布尔值,但不能转为数值
作为属性名的 Symbol
由于每个 Symbol 都是不相等的,就能保证不会出现同名属性
消除魔术字符串
魔术字符串指的是在代码中多次出现与代码形成强耦合的某一个具体字符串或者数值。应该消除魔术字符串改为含义清晰的变量代替
属性名的遍历
Symbol 作为属性名,该属性不会出现在 for...in 、 for...of 循环中,也不会 被 Object.keys() 、 Object.getOwnPropertyNames() 、 JSON.stringify()返回。 Object.getOwnPropertySymbols 用于返回一个对象所有的 Symbol 属性名。
Symbol.for()
Symbol.for()接受一个字符串然后搜索有没有该参数作为名称的 Symbol 值,有则返回,没有就创建一个并返回
Symbol.for("bar") === Symbol.for("bar") // true
Symbol("bar") === Symbol("bar") // false
Symbol.keyFor()
返回一个已经登记的 Symbol 类型的 key
var s1 = Symbol.for("foo");
Symbol.keyFor(s1) // "foo"
var s2 = Symbol("foo");
Symbol.keyFor(s2) // undefined
注意:Symbol.for 为 Symbol 值登记的名字,是全局环境的,可以在不同的 iframe 或 service worker 中取到同一个值。
类型
typeof Symbol() === 'symbol'
typeof Symbol('ConardLi') === 'symbol'
应用
防止 XSS
在 React 的 ReactElement 对象中有一个$$typeof属性,它是一个Symbol类型的变量,React渲染时会把没有$$typeof 标识,以及规则校验不通过的组件过滤掉。 如果前端需要渲染后台存储的 JSON 对象,由于 JSON 中不能存储 Symbol 类型的变量,所以就能将它过滤掉。
私有属性
借助 Symbol 类型的不可枚举,我们可以在类中模拟私有属性
防止属性污染
在某些情况下我们可能需要为对象添加一个属性,此时就有可能造成属性覆盖,用 Symbol 作为对象属性可以保证永远不会出现同名属性。
内置的 Symbol 值
11 个内置的 Symbol 值