Symbol

js中除了undefined number function string object null Boolean,es6新加了一種類型Symbol

{
    let s1=Symbol();
    let s2=Symbol();
    console.log(s1);//Symbol()
    console.log(s2);//Symbol()
    console.log(typeof s1);//Symbol
    console.log(s1==s2);//false
}
description 標識屬性,返回symbol的描述
console.log(Symbol('message').description);//message
很明顯,symbol都是不相等,這是最關鍵的特性

然后繼續往下看,要是symbol傳個參數呢

{
//傳字符串
  let s1=Symbol('string');
  let s2=Symbol('string');
  console.log(s1);//Symbol(string)
  console.log(s2);//Symbol(string)
  console.log(s1==s2);//false

  //傳數組
  const s3=Symbol([1,2,3]);
  const s4=Symbol([1,2,3]);
  console.log(s3);//Symbol(1,2,3)
  console.log(s4);//Symbol(1,2,3)
  console.log(s3==s4);//false
 //傳對象
  const json={a:1};
  const s5=Symbol(json);
  const s6=Symbol(json);
  console.log(s5);//Symbol([object Object])
  console.log(s6);//Symbol([object Object])
  console.log(s5==s6);//false
}
以上例子可以看出,Symbol函數的參數只是表示對當前 Symbol 值的描述,因此相同參數的Symbol函數的返回值是不相等的。

如果想把symbol轉化成其他類型,改擺什么姿勢才行呢,繼續往下看

{
    //Symbol 值可以顯式轉為字符串。
     const s=Symbol('string');
     //console.log('hello'+s);//Cannot convert a Symbol value to a string
     console.log('hello'+String(s));//helloSymbol(string)
     console.log('hello'+s.toString(s));//helloSymbol(string)

     //Symbol 值也可以轉為布爾值,但是不能轉為數值。
     console.log(Boolean(s));//true
     const b=Symbol(1);
     //Number(b);// Cannot convert a Symbol value to a number
}

json對象中使用symbol作為屬性,幾個注意點

{
    let s=Symbol();
    let obj={
         [s]:'symbol',
         s:'hello'
    }
    console.log(obj[s]);//symbol
    console.log(obj.s);//hello
    //Symbol 值作為對象屬性名時,不能用點運算符。用中括號
}

屬性名的遍歷

{
     let s=Symbol();
     let b=Symbol();
     let obj={
          [s]:'symbol',
          s:'hello',
          [b]:'world'
      }
      for (let name in obj){
        console.log(name);//s
      }
     for (let val of Object.values(obj)){
        console.log(val);//hello
     }
     //Symbol 作為屬性名,該屬性不會出現在for...in、for...of循環中


     //下面這個方法循環出屬性名是symbol類型的屬性值
     let arr=Object.getOwnPropertySymbols(obj);
     console.log(arr);//[Symbol(), Symbol()]
     for (let i of Object.values(arr)){
        console.log(obj[i]);//symbol world
     }

     //如果都想循環出來的話,Reflect.ownKeys方法可以返回所有類型的鍵名
     let arrs=Reflect.ownKeys(obj);
     for (let name of Object.values(arrs)){
       console.log(obj[name]);//hello symbol world
    }
}

看一下Symbol.for(),Symbol()的區別

{
    console.log(Symbol()===Symbol());//false
    console.log(Symbol.for()===Symbol.for());//true
}

Symbol.for()與Symbol()這兩種寫法,都會生成新的Symbol。它們的區別是,前者會被登記在全局環境中供搜索,后者不會。Symbol.for()不會每次調用就返回一個新的 Symbol 類型的值,而是會先檢查給定的key是否已經存在,如果不存在才會新建一個值。比如,如果你調用Symbol.for("cat")30次,每次都會返回同一個 Symbol 值,但是調用Symbol("cat")30次,會返回30個不同的Symbol值

Symbol.keyFor的用法

{
    let s1=Symbol('s1');
    let s2=Symbol.for('s2');
    console.log(Symbol.keyFor(s1));//undefined
    console.log(Symbol.keyFor(s2));//s2
}
Symbol.keyFor方法返回一個已登記的 Symbol 類型值的key,這個方法針對Symbol.for()是ok的,但是對Symbol()是掛掉的,返回的是個undefined



ok,按照國際慣例,咱們得來這么一下子
Symbol的幾個特性的介紹這么多,想看更詳細的資料,請狠狠的點擊我



最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1.概述 ES5的對象屬性名都是字符串,這容易造成屬性名的沖突。比如,你使用了一個他人提供的對象,但又想為這個對象...
    趙然228閱讀 814評論 2 10
  • Symbol:一種新的原始數據類型,表示獨一無二的值。 引入Symbol的原因:ES5 的對象屬性名都是字符串,這...
    Rose_yang閱讀 319評論 0 0
  • 前端技術日新月異,不斷有新技術出現,我們就需要不斷地學習新知識,雖然ES6已經提出很久了,但是最近我才有時間靜下心...
    艱苦奮斗的侯小憨閱讀 4,193評論 3 5
  • 1. 概述 ES6引入了一種新的原始數據類型Symbol,表示獨一無二的值。它是JavaScript語言的第七種數...
    ForeverYoung20閱讀 769評論 1 0
  • 最近一直是有晚睡的,昨天因為實在是太累,很早就想碎覺了,然并卵我還是十二點以后誰的,當然比起之前1點多睡是要早很多...
    ABC360蘭迪中教Joy閱讀 253評論 0 0