Symbol 数据类型函数
let s = Symbol(); typeof s; // "symbol"
是 ES6 继 Number,String,Boolean,Undefined,Null 以后引入的新数据类型spa
对象的属性名如今能够有两种类型,一种是原来就有的字符串,另外一种就是新增的 Symbol 类型。设计
Symbol
函数的参数只是表示对当前 Symbol 值的描述code
let s1 = Symbol('foo'); let s2 = Symbol('bar'); s1 // Symbol(foo) s2 // Symbol(bar) s1.toString(); // "Symbol(foo)" s2.toString(); // "Symbol(bar)"
凡是属性名属于 Symbol 类型,就都是独一无二的,能够保证不会与其余属性名产生冲突。对象
背景:blog
ES5 的对象属性名都是字符串,这容易形成属性名的冲突ip
若是有一种机制,保证每一个属性的名字都是独一无二的就行了,这样就从根本上防止属性名的冲突。字符串
Symbol
表示独一无二的值。get
它是 JavaScript 语言的第七种数据类型iframe
Symbol 值能够显式转为字符串
Symbol 值能够显式转为布尔值
即便 Symbol
函数参数相同,可是它们是不相等的。在对象的内部,使用 Symbol 值定义属性时,Symbol 值必须放在方括号之中
let s = Symbol(); let obj = { [s]: function (arg) { ... } }; obj[s](123);
switch
语句会按设计的方式工做const COLOR_RED = Symbol(); const COLOR_GREEN = Symbol(); function getComplement(color) { switch (color) { case COLOR_RED: return COLOR_N: return COLOR_GREEN; case COLOR_GREERED; default: throw new Error('Undefined color'); }; };
const shapeType = { triangle: Symbol(), }; function getArea(shape, options) { let area = 0; switch (shape) { case shapeType.triangle: area = .5 * options.width * options.height; break; }; return area; }; getArea(shapeType.triangle, { width: 100, height: 100 });
for...in
、for...of
循环中,也不会被Object.keys()
、Object.getOwnPropertyNames()
、JSON.stringify()
返回Object.getOwnPropertySymbols()
获取指定对象的全部 Symbol 属性名。接受一个字符串做为参数,而后搜索有没有以该参数做为名称的 Symbol 值。
let s1 = Symbol.for('foo'); // 登记在全局环境中供搜索 let s2 = Symbol.for('foo'); // 登记在全局环境中供搜索 s1 === s2 // true
Symbol.for()
与Symbol()
这两种写法,都会生成新的 Symbol。
它们的区别是:
前者会被登记在全局环境中供搜索,后者不会。
Symbol.for()
不会每次调用就返回一个新的 Symbol 类型的值,而是会先检查给定的key
是否已经存在,若是不存在才会新建一个值。
好比,若是你调用Symbol.for("cat")
30 次,每次都会返回同一个 Symbol 值,
可是调用Symbol("cat")
30 次,会返回 30 个不一样的 Symbol 值
Symbol.keyFor
() 返回一个已登记的 Symbol 类型值的 key,即 Symbol.for() 生成的 Symbol 值
注意: 为 Symbol 值登记的名字,是全局环境的,能够在不一样的 iframe 或 service worker 中取到同一个值
let obj = { [Symbol('my_key')]: 1, enum: 2, nonEnum: 3 }; Reflect.ownKeys(obj); // ["enum", "nonEnum", Symbol(my_key)]