ES6的新特性之Symbol关键字
Symbol
概述
ES6 引入了一种新的原始数据类型Symbol
,表示独一无二的值。它是 JavaScript 语言的第七种数据类型,前六种是:undefined
、null
、布尔值(Boolean)、字符串(String)、数值(Number)、对象(Object)。
Symbol 值通过Symbol
函数生成。这就是说,对象的属性名现在可以有两种类型,一种是原来就有的字符串,另一种就是新增的 Symbol 类型。凡是属性名属于 Symbol 类型,就都是独一无二的,可以保证不会与其他属性名产生冲突。
Symbol
函数可以接受一个字符串作为参数,表示对 Symbol 实例的描述,主要是为了在控制台显示,或者转为字符串时,比较容易区分。
let s = Symbol('foo'); s // Symbol(foo) s.toString() // "Symbol(foo)"复制代码
Symbol 值不能与其他类型的值进行运算,会报错。
let sym = Symbol('My symbol'); "aaa" + sym // TypeError: can't convert symbol to string复制代码
Symbol.prototype.description
创建 Symbol 的时候,可以添加一个描述。
const sym = Symbol('foo');复制代码
ES2019提供了一个实例属性description
,直接返回 Symbol 的描述。
const sym = Symbol('foo'); sym.description // "foo"复制代码
作为属性名的 Symbol
let mySymbol = Symbol(); let a = {}; a[mySymbol] = 'Hello!';复制代码
注意,Symbol 值作为对象属性名时,不能用点运算符。
Symbol.for()
Symbol.for()
与Symbol()
这两种写法,都会生成新的 Symbol。它们的区别是,前者会被登记在全局环境中供搜索,后者不会。Symbol.for()
不会每次调用就返回一个新的 Symbol 类型的值,而是会先检查给定的key
是否已经存在,如果不存在才会新建一个值。
Symbol.for("bar") === Symbol.for("bar") // true Symbol("bar") === Symbol("bar") // false复制代码
symbol.for()创建 参数是键 键一样结果一样,symbol()创建 参数是描述 描述一样其实是不一样的值。
作者:偏爱自由_
链接:https://juejin.cn/post/7018540288146669604