基本数据类型--Symbol学习笔记

 //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))

你可能感兴趣的:(基本数据类型--Symbol学习笔记)