今天在看es6的时候看到的Symbol部分
const mySymbol = Symbol() const a = {} a.mySymbol = 'Hello!' console.log(a[mySymbol]) console.log(a['mySymbol'])
因为点运算符后面总是字符串,所以不会读取mySymbol作为标识名所指代的值,导致a的属性名实际上是一个字符串,而不是一个Symbol值,所以Symbol作为对象属性名的时候不能用点运算符
let s = Symbol(); let obj = { [s]: function(arg) { } }; obj[s](123); //上面的代码中如果s不放在方括号中,该属性的键名就是字符串s,而不是s所代表的那个Symbol值,采用增强写法,上面的obj对象可以更简洁些 let obj = { [s](arg) { } }
Sybmol类型还可以用于定义一组常量,保证这组常量的值都是不相等的
const log = {} log.levels = { DEBUG: Symbol('debug'), INFO: Symbol('info'), WARN: Symbol('warn') } console.log(log.levels.DEBUG, 'debug message') console.log(log.levels.INFO, 'info message')
另一个
const COLOR_RED = Symbol() const COLOR_GREEN = Symbol() function getComplement(color) { switch (color) { case COLOR_RED: return COLOR_GREEN case COLOR_GREEN: return COLOR_RED default: throw new Error('Undefined color') } } //常量使用Symbol值最大的好处就是,其他任何值都不可能有相同的值了,Symbol值作为属性名时,该属性是公开属性
........................想他