摘要:在比較字符串數值和布爾值的相等性時,問題還比較簡單。后來,有人提出了這種轉換到底是否合理的質疑。相等時的隱式轉換對于操作符,通常都會先隱式轉換強制轉換,然后再比較它們的相等性。要比較相等性之前,不能將和轉換成其他任何值。
確定兩個變量是否相等是編程中的一個非常重要的操作。 在比較字符串、數值和布爾值的相等性時,問題還比較簡單。但在涉及到對象的比較時,問題就變得復雜了。最早的 ECMAScript 中的相等和不等 操作符會在執行比較之前,先將對象轉換成相似的類型。后來,有人提出了這種轉換到底是否合理的質疑。 最后,ECMAScript 的解決方案就是提供兩組操作符: 相等和不相等——先轉換再比較,全等和不全等——僅比較而不轉換。 此處我們只對相等做一些討論。
"==" 相等 時的隱式轉換
對于 "==" 操作符,通常都會先隱式轉換(強制轉換),然后再比較它們的相等性。隱式轉換規則:
如果有一個操作數是布爾值,則在比較相等性之前先將其轉換為數值——false 轉換為 0,而true轉換為 1;
如果一個操作數是字符串,另一個操作數是數值,在比較相等性之前先將字符串轉換為數值;
字符串轉換為數值:
(1)數字類型的字符串,會被轉成對應十進制的數值; (2)空字符串會轉換成0; (3)其余的全都會轉換為NaN;(NaN 與任何值都不相等,包括自身)
如果一個操作數是對象,另一個操作數不是,則調用對象的 valueOf()方法,用得到的基本類型值按照前面的規則進行比較;
下面可以通過一個簡單的例子來看一下 JS 底層的轉換規則。
// 根據隱式轉換規則第三條 調用對象的 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 不相等?
//現在我們可以參照上面隱式轉換的過程,對空對象手動的執行這個過程,結果如下 ({}).valueOf() // {} ({}).toString() // "[object Object]" // 這時我們發現 空對象 與 空數組默認行為的區別了,在 toString 方法上,由于數組會對繼承自對象的 toString 方法進行重寫,將數組中的每個元素通過 "," 鏈接成一個字符串 // 這時就變成了 "[object Object]" == false // 根據規則第二條,得到最后結果 false隱式轉換的特殊規則:
null 和 undefined 是相等的。
要比較相等性之前,不能將 null 和 undefined 轉換成其他任何值。
如果有一個操作數是 NaN,則相等操作符返回 false,而不相等操作符返回 true。
如果兩個操作數都是對象,則比較它們是不是同一個對象。(比較引用類型的地址是否相同)
null == undefined // true NaN == NaN // false NaN != NaN // true false == 0 // true undefined == 0 // true null == 0 // true
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/100911.html
摘要:具體的行為取決于參數的類型。說到,就不得不提一下方法,方法自帶隱式類型轉換,該方法在測試其參數之前,會先調用方法將其轉換為數字。全等運算符會先進行數據類型判斷,并且不會發生隱式類型轉換。 類型轉換還不行?還非得隱式?這是什么高級玩意? 廢話不多說,我們先上一盤?,額,不對,先看一個例子吧。 3 + true 實際上在大多數編程語言中,都會認為上面這個表達式是錯誤的。因為布爾表達式與算術...
摘要:強制類型轉換作為程序員,你一定獲取過當前系統的時間戳。比如對于變量而言,此次強制類型轉換是隱式的。然而則是非常典型的顯式強制類型轉換。隱式強制類型轉換大部分被詬病的強制類型轉換都是隱式強制類型轉換。 JavaScript 強制類型轉換 作為 JavaScript 程序員,你一定獲取過當前系統的時間戳。在 ES5 引入 Date.now() 靜態方法之前,下面這段代碼你一定不會陌生: v...
摘要:雖然你可能很驚訝甚至可能懷疑是的但是這都是有語言自己的一個隱式類型轉換的套路?;镜碾[式類型轉換基本類型的隱式轉換這個其實我們使用的最多例如結果返回的是而不是這就是類型的隱式轉換。 基本上所有的語言都有 隱式類型轉換 ,但是對于 弱類型語言(JS) 來說 ,隱式類型轉換會比 強類型語言(Java) 帶來更大的副作用,有些行為甚至是不可思議的。雖然你可能很驚訝 ,甚至可能懷疑是 JS 的...
摘要:所謂裝箱轉換,正是把基本類型轉換為對應的對象,他是類型轉換中一種相當重要的種類。拆箱轉換在標準中,規定了函數,它是對象類型到基本類型的轉換即,拆箱轉換。拆箱轉換會嘗試調用和來獲得拆箱后的基本類型。 JavaScript隱式類型轉換 基本數據類型 ECMAScript 一共定義了七種 build-in types,其中六種為 Primitive Value,Null, Undefined...
摘要:顯示的調用轉換過程稱為顯式強制類型轉換,隱式的情況稱為隱式強制類型轉換。隱式強制類型轉換讓代碼變得晦澀難懂而又便捷而奇妙。事實上,允許在比較中進行強制類型轉換,而不允許。如果有并且返回基本類型值,就使用該值進行強制類型轉換。 JavaScript是一種非常靈活的現代編程語言,靈活到使用者極其容易被忽視的它那廣闊的世界以及它帶給我們的無限遐想空間。本文將對JavaScript最最基礎也最...
摘要:看下面的代碼和會對操作數執行條件判斷,如果操作數不是布爾值,會先執行類型轉換后再執行條件判斷。大家記住這個規則布爾值如果與其他類型進行抽象比較,會先用將布爾值轉換為數字再比較。 在上一篇中我們聊過了 JS 類型轉換的規則和我發現的一些常見書籍中關于類型轉換的一些小錯誤,當碰到顯示類型轉換的時候大家可以按照這些規則去拆解出答案。但 JS 中存在一些很隱晦的隱式類型轉換,這一篇就來談下我對...
閱讀 1267·2021-09-22 15:18
閱讀 2595·2021-09-22 15:17
閱讀 2224·2019-08-30 15:55
閱讀 1572·2019-08-30 15:54
閱讀 1036·2019-08-30 13:12
閱讀 622·2019-08-30 13:12
閱讀 1675·2019-08-29 11:33
閱讀 1434·2019-08-26 17:04