- //Symbol 值通过 `Symbol` 函数生成
- let s=Symbol();
- console.log(typeof s); //symbol
- //============= 传字符串 ==============
- //`Symbol` 函数可以接受一个字符串作为参数,
- // 有了参数以后, 就等于为它们加上了描述
- let s1=Symbol('foo');
- let s2=Symbol('bar');
- console.log(s1); //Symbol(foo)
- console.log(s2); //Symbol(bar)
- // 转为字符串时, 比较容易区分
- console.log(s1.toString()); //'Symbol(foo)'
- console.log(s2.toString()); //'Symbol(bar)'
- //============= 传对象 ==============
- // 如果 Symbol 的参数是一个对象
- // 就会调用该对象的 `toString` 方法, 将其转为字符串, 然后才生成一个 Symbol 值.
- const obj={
- toString(){
- return '自动调用 toString 方法';
- }
- }
- const sym=Symbol(obj);
- console.log(sym); //Symbol(自动调用 toString 方法)
- //==========Symbol 值不相等 ============
- // 相同参数的 `Symbol` 函数的返回值是不相等的
- // 无参数, 不相等
- let s3=Symbol();
- let s4=Symbol();
- console.log(s3==s4); //false
- console.log(s3===s4); //false
- console.log(s3!=s4); //true
- console.log(s3!==s4); //true
- // 有参数, 也不相等
- let s5=Symbol('foo');
- let s6=Symbol('foo');
- console.log(s5===s6); //false
- let s7=Symbol('不能和其他类型运算, 比如字符串拼接');
- //console.log('test'+s7);//Uncaught TypeError: Cannot convert a Symbol value to a string
- //console.log(`${s7}`);//Uncaught TypeError: Cannot convert a Symbol value to a string
- let s8=Symbol('可以显式转为字符串');
- console.log(String(s8)); //'Symbol(可以显式转为字符串)'
- console.log(s8.toString()); //'Symbol(可以显式转为字符串)'
- let s9=Symbol();
- console.log(Boolean(s9)); //true
- console.log(!!s9) //true
- console.log(!s9); //false
- if(s9){
- console.log('Symbol 默认布尔值为 true');
- }
- // console.log(Number(s9));
- // console.log(s9+2)
- // 作为属性名的 Symbol
- let mySymbol=Symbol();
- // 写法一
- let a={};
- a[mySymbol]='hello';
- // 写法二
- let a={
- [mySymbol]:'hello'
- }
- // 写法三
- let a={};
- Object.defineProperty(a,mySymbol,{
- value:'hello'
- });
- console.log(a[mySymbol]) //hello
- // 点运算符后面总是字符串,
- // 所以不会读取 `mySymbol` 作为标识名所指代的那个值
- // 导致 `a` 的属性名实际上是一个字符串, 而不是一个 Symbol 值
- let _mySymbol=Symbol();
- let b={};
- b._mySymbol='Hello';
- console.log(b._mySymbol); // string | 'Hello'
- console.log(b[_mySymbol]); //undefined|undefined
- console.log(b['_mySymbol']); // string | 'Hello'
- // 在对象的内部, 使用 Symbol 值定义属性时, Symbol 值必须放在方括号之中
- let s = Symbol();
- // 写法一
- /*let obj = {
- [s]: function (arg) { console.log('当前参数是:'+arg) }
- };*/
- // 写法二
- let obj = {
- [s] (arg) { console.log('当前参数是:'+arg) }
- };
- console.log(obj[s](123))
来源: http://www.jianshu.com/p/33994e5b6e93