1. 程式人生 > 程式設計 >詳細談談ES6中的symbol資料型別

詳細談談ES6中的symbol資料型別

目錄
  • symbol資料型別
    • symbol出現的原因
    • Symbol特點
  • symbol的應用
    • 在rb物件中新增up和down方法
  • Symbol內建的屬性值
    • 總結

      symbol資料型別

      語言中,ES6前有6種資料型別。

      ES6新提出symbol資料型別,所以symbol是js的第七種資料型別,表示獨一無二的值。是一種類似於字串的資料型別。

      目的是為了防止屬性名的衝突,保證物件中每一個屬性名都是獨一無二的。

      let s1 = Symbol('foo');
      let s2 = Symbol('foo');
      
      s1 === s2 // false
      

      Symbol型別可以有一個字串引數,表示對Symbol例項的描述。所以相同描述的兩個Symbol型別例項也是不相等的。

      symbol出現的原因

      ES5 的物件屬性名都是字串,這容易造成屬性名的衝突。比如,你使用了一個他人提供的物件,但又想為這個物件新增新的方法(mixin 模式),新方法的名字就有可能與現有方法產生衝突。如果有一種機制,保證每個屬性的名字都是獨一無二的就好了,這樣就從根本上防止屬性名的衝突。這就是 ES6 引入Symbol的原http://www.cppcns.com

      Symbol特點

      • Symbol的值是唯一的,用來解決命名衝突的問題
      • Slymbol 值不能與其他資料進行運算
      • Symbol 定義的物件屬性不能使用fr..in 迴圈遍歷,但是可以使用Reflect.ownKeys來獲取物件的所有鍵名
      • Symbol函式前不能使用new命令,否則會報錯。這是因為生成的 Symbol 是一個原始型別的值,不是物件。也就是說,由於 Symbol 值不是物件,所以不能新增屬性。基本上,它是一種類似於字mkjbJliU符串的資料型別。
      //建立Symbol
      let s= Symbol();
      console.log(s,typeof s);
      
      
      // 試試建立2個symbol相同
      let s2 = Symbol(' 辣雞rb');
      let s3 = Symbol(' 辣雞rb');
      console.log(s2 === s3); //false
      
      
      //用Symbol.for建立一樣的symbol
      let s4 = Symbol.for('辣雞rb');
      let s5 = Symbol.for('辣雞rb');
      console.log(s4 === s5); //true
      
      
      //不能與其他資料進行運算
      let result = s + 100;//報錯,
      

      文章結尾回顧一下js的資料型別

      引用尚矽谷的一個記憶口訣

      // USONB =>you are so .niubility 你是如此牛mkjbJliU逼
      
      // u=>undefined
      
      // s=>string symbol
      
      // 0=>object
      
      // n=>null number
      
      // b=>boolean
      

      思考一下,決定再寫點,

      symbol的應用

      在rb物件中新增up和down方法

      方法1

      let rb = {
          name: '日本戰犯',age: 500,};
      // 用symbol處理
      // 宣告物件,裡面包含兩個方法,方法用symbol()寫
      let methods = {
          up: Symbol(),down: Symbol()
      };
      // 把方法加進去
      rb[methods.up] = function () {
          console.log('原諒說的是人');
      };
      rb[methods.down] = function () {
          console.log('畜生沒臉讓中華兒女原諒它');
      };
      console.log(rb);
      

      方法2

      在rb物件中新增sb和dsb方法

      let rb = {
          name: '日本戰犯',[Symbol('sb')]: function () {
              console.log('我喜歡日本動畫');
          },[Symbol('dsb')]: function () {
               console.log('但不妨礙我恨他們在華夏大地犯的罪');
           },};
      
      console.log(rb);
      

      Symbol內建的屬性值

      • Symbol.hasInstance:其它物件使用instanceof運算子的時候會使用該屬性名指向的內部方法。
      • Symbol.isConcatSpreadable
      • Symbol.species
      • Symbol.match
      • mkjbJliU
      • Symbol.replace
      • Symbol.search
      • Symbol.split
      • Symbol.iterator
      • Symbol.toPrimitive
      • Symbol.toStringTag
      • Symbol.unscopables

      總結

      到此這篇關於ES6中symbol資料型別的文章就介紹到這了,更多相關ES6的symbol資料型別內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!