参考自:http://es6.ruanyifeng.com/#docs/symbol
以上写法都能得到同样结果:
a[s]; // symbol Symbol作为属性名时使用[]。如果不使用[]表示这个一个字符串类型的键。 var a = {}; var s = Symbol(); a.s = 'string'; a[s]; // undefined; a['s']; // 'string'; Symbol作为属性名,for…in(属性包括原型链,并且可枚举,属性是字符串)、for…of、Object.keys(属性不包括原型链、可枚举)、Object.getOwnPropertyNames(属性不包括原型链,包括不可枚举)这四个方法无法遍历Symbol作为属性名的情况。通过Object.getOwnPropertySymbols方法个亿获取指定对象的Symbol属性名。 var obj = {}; var a = Symbol('a'); var b = Symbol('b'); obj[a] = 'aaa'; obj[b] = 'bbb'; Object.getOwnPropertySymbols(obj); // [Symbol(a), Symbol(b)] 另一个API----Reflect.ownKeys方法可以返回所有类别的键名,包括常规键名和Symbol键名。有时,我们希望可以重新使用一个Symbol值,Symbol.for方法可以做到这一点,它接受一个字符串作为参数,然后搜索有没有以该参数作为名称的Symbol值,如果有,就返回这个Symbol值,如果没有,那么就新建一个并返回以该字符串为名称的Symbol值。
var s = Symbol.for('foo'); var s2 = Symbol('foo'); s == s2; // false var s = Symbol.for('foo'); var s2 = Symbol.for('foo'); s === s2; // true可以看出,Symbol和Symbol.for都出返回一个Symbol。但是前者不会被登记到全局环境中供搜索。而后者会。
Symbol.keyFor返回一个已经登记(使用Symbol.for)的Symbol类型值的key。
var s1 = Symbol.for('foo'); Symbol.keyFor(s1); // 'foo' var s2 = Symbol('bar'); Symbol.keyFor(s2); // undefinedSymbol.toPrimitive 对象的Symbol.toPrimitive属性,指向一个方法。该对象被转为原始类型的值时,会调用这个方法,返回该对象对应的原始类型值。
Symbol.toPrimitive被调用时,会接受一个字符串参数,表示当前运算的模式,一共有三种模式。
Number:该场合需要转成数值String:该场合需要转成字符串Default:该场合可以转成数值,也可以转成字符串 let obj = { [Symbol.toPrimitive](hint) { switch (hint) { case 'number': return 123; case 'string': return 'str'; case 'default': return 'default'; default: throw new Error(); } } }; 2 * obj // 246 3 + obj // '3default' obj == 'default' // true String(obj) // 'str' Symbol.toStringTagSymbol.unscopables