1. 程式人生 > 程式設計 >詳解JavaScript物件轉原始值

詳解JavaScript物件轉原始值

目錄
  • Object.prototype.valueOf()
  • Object.prototype.toString()
  • Symbol.toPrimitive
  • 物件轉換原始值
    • 1. 預期被轉換成字串型別
    • 2. 預期被轉換成數字型別
    • 3. 預期被轉換成預設型別(其他)
  • 三種方法觸發的順序
    • 總結

      Object.prototype.valueOf()

      物件的valueOf旨在返回物件的原始值,會在需要將物件轉換成原始值的地方自動執行。詳細點這裡。

      Object.prototype.toString()

      toString()方法會返回表示該物件的字串,會在物件預期要被轉換成字串的地方自動執行。物件預設的toString()方法會返回[object type],這個type就是物件建構函式的名稱。詳細點這裡。

      Symbol.toPrimitive

      Symbol.toPrimitive(hint)方法作用同valueOf()一樣,但是優先順序要高於valueOf();而且該方法還會接受http://www.cppcns.com一個引數hint,這個引數用來表示期望轉換的原始值的具體型別,有以下幾種:

      • number:數字型別
      • string:字串型別
      • default:預設
      let obj = {
        [Symbol.toPrimitive](hint) {
          switch (hint) {
            case 'number':
              return 123;
            case 'string':
              return 'str';
            case 'default':
              return 'default';
      rFcyyNCzH
      default: throw new Error(); } } }; 2 * obj // 246 3 + obj // '3default' obj == 'default' // true String(obj) // 'str'

      物件轉換原始值

      以上三種方法都是在物件被預期轉換成某種原始值時觸發。

      1. 預期被轉換成字串型別

      對應的hint型別為string

      進行輸出的地方,如alert()

      String(obj)

      let a = {
        toString () {
          return '2'
        }
      }
      console.log(String(a)) // 2
      

      字串連線(+)操作

      let a = {
        toString () {
          return '2'
        }
      }
      console.log(a + 'vv')
      

      模板字串

      let a = {
        [Symbol.toPrimitive] (hint) {
          console.log(hint) // string
          return 2
        }
      }
      console.log(`你是老${a}?`) // 你是老2?
      

      2. 預期被轉換成數字型別

      對應的hint型別為numbe

      除法:

      let a = {
        valueOf () {
          return 2
        }
      }
      console.log(2 / a,a / 2) // 1  1
      

      Number(obj):

      let a = {
        [Symbol.toPrimitive] (hint) {
          console.log(hint) // number
          return 2
        }
      }
      console.log(Number(a)) // 2
      

      正負號(注意不是加減運算):

      let a = {
        [Symbol.toPrimitive] (hint) {
          console.log(hint) // number
          return 2
        }
      }
      console.log(+a) // 2
      console.log(-a) // http://www.cppcns.com-2
      

      3. 預期被轉換成預設型別(其他)

      對應的hint型別為default

      數字加法(即與物件相加的一方為數字型別):

      let a = {
        [Symbol.toPrimitive] (hint) {
          console.log(hint) // default
          return 2
        }
      }
      console.log(1 + a) // 3
      

      這一點有點意外,原以為像這種情況預期轉換的型別應該是數字型別,但事實上卻是default;

      布林運算:所有物件都被轉換成true;

      let a = {
        [Symbol.toPrimitive] (hint) {
          console.log(hint) // 沒有觸發
          return false
        }
      }
      console.log(Boolean(a),a && 123) // true 123
      

      布林運算包括==

      三種方法觸發的順序

      首先判斷物件是否有Symbol.toPrimitive(hint)方法,若有則執行該方法,沒有則執行下面的步驟;

      如果預期被轉換成字串型別時,則優先執行toString()方法;

      如果預期被轉換成預設型別或者數字型別時,則優先執行valueOf()方法:

      :若沒有valueOf()方法,但是定義了toString()方法,則會執行toString()方法;

      總結

      本篇文章就到這裡了,希望能夠給你帶來幫助,也希望www.cppcns.com您能夠多多關注我們的更多內容!