比較操做符

比較操做符

二者類型不一樣

  • 特殊類型比較
    不進行類型轉化,須要強記;code

    null == undefined // true
      symbol(1) == 1 // false
  • 類型轉化( == , > , < , != , >=, <= )對象

    • boolean, string, number 兩兩比較會轉化爲 number進行比較;
      Number(boolean) == Number
      Number(string) == Numberip

      true == 2 // false
        true == 1 // true
        true == 0 // false
      
        true == '2' // false
        true == '1' // true
        true == '0' // false
      
        '1' ==  2 // false
        '1' ==  1 // true
        '1' ==  0 // false
      
        true > 2 // false
        true > 1 // false
        true > 0  // true
      
        true > '2' // false
        true > '1' // false
        true > '0' // true
      
        '1' >  2 // false
        '1' >  1 // false
        '1' >  0 // true
      
        'null' ==  1 // false  <=> Number('null') == 1  <=>  NaN == 1
        'null' ==  2  // false
        'null' ==  NaN // false <=> Number('null') == NaN  <=>  NaN == NaN
      
        'undefined' ==  1 // false  <=> Number('undefined') == 1  <=>  NaN == 1
        'undefined' ==  2  // false
        'undefined' ==  NaN // false <=> Number('null') == NaN  <=>  NaN == NaN
    • 若是一個對象與數字或字符串相比較,JavaScript會嘗試返回對象的默認值。操做符會嘗試經過方法valueOf和toString將對象轉換爲其原始值(一個字符串或數字類型的值)。若是嘗試轉換失敗,會產生一個運行時錯誤。字符串

      • 既無自定義valueOf,又無自定義toString,則調用默認toStringget

        const a = {name: 'andy'}
          a == '[object Object]' // true
        
          a > '4' // true
          a > '3' // true
          a > '2' // true
          a > 'p' // false  <=> a.toString() > 'p' <=> '[object Object]' > 'p'
        
          a > 4 // false
          a > 3 // false
          a > 2 // false
      • 只存在自定義toString,則調用自定義toStringstring

        const a = {name: 'andy'}
          a.toString = () => 4
        
          a == '[object Object]' // false
          a == 4 // true
        
          a > '4' // false
          a > '3' // true
          a > '2' // true
      • 只存在自定義valueOf,則調用自定義valueOfobject

        const a = {name: 'andy'}
        a.valueOf = () => 3
        
        a == '[object Object]' // false
        a == 3 // true
        
        a > '4' // false
        a > '3' // false
        a > '2' // true
      • 既存在自定義valueOf,又存在自定義toString方法,則自定義valueOf優先級更高;引用

        // 同時存在 valueof 和 toString
          const a = {name: 'andy'}
          a.valueOf = () => 3
          a.toString = () => 4
        
          a == '[object Object]' // false
          a == 4 // false
          a == 3 // true
        
          a > '4' // false
          a > '3' // false
          a > '2' // true

二者類型相同

  • 必須值也相同,才返回true方法

    NaN === NaN // false
      +0 === -0 // true
      null === null // true
      undefined === undefined //true
  • 字符串比較基於Unicode 值developer

    '5' > '10' // true
  • 對象比較基於引用地址

    {} == {}  // false
      new String('foo') == new String('foo') // false
      new String('foo') == 'foo' // true  隱含了類型轉化 <=> new String('foo').valueOf() == 'foo'
相關文章
相關標籤/搜索