溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Javascript隱式轉換的使用方法

發(fā)布時間:2020-09-26 09:43:12 來源:億速云 閱讀:136 作者:小新 欄目:web開發(fā)

這篇文章主要介紹Javascript隱式轉換的使用方法,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

確定兩個變量是否相等是編程中的一個非常重要的操作。
在比較字符串、數值和布爾值的相等性時,問題還比較簡單。但在涉及到對象的比較時,問題就變得復雜了。最早的 ECMAScript 中的相等和不等 操作符會在執(zhí)行比較之前,先將對象轉換成相似的類型。后來,有人提出了這種轉換到底是否合理的質疑。
最后,ECMAScript 的解決方案就是提供兩組操作符:
   相等和不相等——先轉換再比較,全等和不全等——僅比較而不轉換。
此處我們只對相等做一些討論。

"==" 相等 時的隱式轉換

對于 "==" 操作符,通常都會先隱式轉換(強制轉換),然后再比較它們的相等性。

隱式轉換規(guī)則:

1.如果有一個操作數是布爾值,則在比較相等性之前先將其轉換為數值——false 轉換為 0,而true轉換為 1;

2.如果一個操作數是字符串,另一個操作數是數值,在比較相等性之前先將字符串轉換為數值;
  字符串轉換為數值:

(1)數字類型的字符串,會被轉成對應十進制的數值;
  (2)空字符串會轉換成0;
  (3)其余的全都會轉換為NaN;(NaN 與任何值都不相等,包括自身)

3.如果一個操作數是對象,另一個操作數不是,則調用對象的 valueOf()方法,用得到的基本類型值按照前面的規(guī)則進行比較;

下面可以通過一個簡單的例子來看一下 JS 底層的轉換規(guī)則。

    // 根據隱式轉換規(guī)則第三條 調用對象的 valueOf 方法
    [].valueOf() // []

    // 這時就變成 [] == false ,又回到原來的情況,這時JS底層又是怎么處理的呢?
    // 其實 JS 的底層在調用 valueOf 得到的返回結果如果不是原始值時,就會調用對象的 toString 方法將對象轉換成字符串。對于這個過程我們可以通過一下的例子來驗證。

    [].valueOf() // []
    [].toString() // ''
    //上面是 這兩個方法的 默認行為,在下面的例子中我們不改變默認行為
    [].__proto__.valueOf = () => { console.log('valueOf'); return []; }
    [].__proto__.toString = () => { console.log('toString'); return ''; }
    [] == false
    // 運行的結果為 valueOf toString true
    // 這樣就驗證了上述的說明


      // 我們還可以通過下面的方式,從側面在次驗證 JS底層默認的轉換行為

    [].__proto__.valueOf = () => { console.log('valueOf'); return ''; }
    [].__proto__.toString = () => { console.log('toString'); return ''; }
    [] == false
    // valueOf true

    [].__proto__.valueOf = () => { console.log('valueOf'); return []; }
    [].__proto__.toString = () => { console.log('toString'); return []; }
    [] == false
    // JS 報錯 Uncaught TypeError: Cannot convert object to primitive value

現在我們可以來看看例子中 空對象為什么不等于 false?從正常的角度來講,數組就是一個對象,為什么空數組等于 false,而空對象為什么和 false 不相等?

    //現在我們可以參照上面隱式轉換的過程,對空對象手動的執(zhí)行這個過程,結果如下
    ({}).valueOf() // {}
    ({}).toString() // '[object Object]'

    // 這時我們發(fā)現 空對象 與 空數組默認行為的區(qū)別了,在 toString 方法上,由于數組會對繼承自對象的 toString 方法進行重寫,將數組中的每個元素通過 ',' 鏈接成一個字符串
    // 這時就變成了 '[object Object]' == false 
    // 根據規(guī)則第二條,得到最后結果 false

隱式轉換的特殊規(guī)則:

  1. null 和 undefined 是相等的。

  2. 要比較相等性之前,不能將 null 和 undefined 轉換成其他任何值。

  3. 如果有一個操作數是 NaN,則相等操作符返回 false,而不相等操作符返回 true。

  4. 如果兩個操作數都是對象,則比較它們是不是同一個對象。(比較引用類型的地址是否相同)

    null == undefined  // true
    NaN == NaN         // false
    NaN != NaN         // true
    false == 0         // true
    undefined == 0     // true
    null == 0          // true

以上是Javascript隱式轉換的使用方法的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI