Javascript 隱式轉換

2021-09-12 21:42:26 字數 2321 閱讀 8791

確定兩個變數是否相等是程式設計中的乙個非常重要的操作。

在比較字串、數值和布林值的相等性時,問題還比較簡單。但在涉及到物件的比較時,問題就變得複雜了。最早的 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 = () =>

.__proto__.tostring = () =>

== false

// 執行的結果為 valueof tostring true

// 這樣就驗證了上述的說明

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

.__proto__.valueof = () =>

.__proto__.tostring = () =>

== false

// valueof true

.__proto__.valueof = () =>

.__proto__.tostring = () =>

== 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

javaScript學習之隱式轉換

搬家篇三 true false 123 123 123 0 1 0 true 因為大於等於的比較,不是相等的比較,所以 object object object object null true undefined nan 由以下變化可以證得 nan nan nan 0優先順序最高的是字串,任何運算...

scala 隱式轉換函式 隱式轉換引數

目前的scala相關部落格大概只能算乙個筆記,方便自己記錄,也幫大家查詢資訊了。首先scala中的隱式轉換可以分為隱式函式轉換與隱式引數轉換兩類,下面就來分別說一下自己對這兩種模式的理解。1 隱式函式轉換,我們先看一段 scala val x int 3.14 10 error type misma...

隱式轉換和隱式引數

1 隱式轉換 隱式轉換函式是以implicit關鍵字宣告的帶有單個引數的函式。這種函式將會自動應用,將值從一種型別轉換為另一種型別 object scala01 implicit def f1 d double int double 是輸入型別,int 是轉換後的型別 隱式函式的底層工作原理 def...