js中相等性判斷探索

2021-10-02 08:18:37 字數 1782 閱讀 6707

最近發現乙個比較神奇的問題如下

== false   // true

!! == true // true

一臉懵逼中。。。

那麼,現在就來從開始探索一下這道題的原理

js比較操作

js提供了三中不同的比較操作,分別是:

* 嚴格相等 ("triple equals" 或 "identity"),使用 ===

* 寬鬆相等 ("double equals") ,使用 ==

* es6新出的object.is()

說一下幾種操作的特點與不同。首先,使用=== 與ojbect.is()進行比較時,是不會進行型別轉換的,先判斷兩邊的資料型別,如要兩邊的資料型別不同,就會直接返回false,再判斷資料的值是否相同,這裡有個坑點就是對於number,=== 與ojbect.is()在處理+0, -0, 與nan方面有一些不同之處,如下

+0 === -0  // true

object.is(+0, -0) // false

nan === nan // false

object.is(nan, nan) // true

再來說一下==,這個因為涉及到了型別的轉換,比較複雜一些。

* 相等操作符比較兩個值是否相等,在比較前將兩個被比較的值轉換為相同型別。在轉換後(等式的一邊或兩邊都可能被轉換),最終的比較方式等同於全等操作符 === 的比較方式。

* 理解一下兩個方法,tonumber(a),是指在比較前將a轉為數字,與 +a(單目運算子+)的效果相同。toprimitive(a), 是指通過呼叫a.tostring()或者a.valueof()方法將a轉為原始值(primitive)

然後來看一下**

可知:1、undefined 和 null:一般情況下,他們只和自身及對方相等,其他情況都會返回false。有個isfalsy()看起來很奇怪,物件不都應該是返回true麼,有啥好判斷的?還真不是……有些瀏覽器會允許一些特殊的物件,如:document.all 等,在某些情況下(相等操作符等)充當undefined的角色,所以,他就會返回false。都是坑爹呢這是……

2、number: 想與numbr進行對比,二話不說,你先轉成number再bb

3、boolean:剛想與boolean做比較,額,他倒是先轉成number了,得嘞,走上了與number比較的老路

4、object:可能因為object比較雜,所以需要先通過toprimitive()去找到他的真身以後再進行比較

5、string:優先順序最低,因為留給他的對手不多了,一般都是被迫轉型,除非對手是string或者toprimitive()是string

看起來,型別轉換機制還挺複雜的,所以,一般情況下,能用 === 的就盡量不要用 == 了,免得掉進了自己的坑里。什麼,非要用==不可?好吧,來看看一下幾個案例:

"0" == false; // true

false == 0; // true

false == ""; // true

false == ; // true

"" == 0; // true

"" == ; // true

0 == ; // true

如果以上這些情況你都能理解,嗯,你可以放心的用==了。

C 中相等性判斷

我們在想對乙個可列舉的物件集合進行去重操作時,一般第乙個想到的就是就是linq的distinct方法。先定義乙個類,然後使用distinct方法去重。class man public string name public string adress public decimal weight pub...

初時相等性判斷

1.概述 c 中有四種方式用來進行相等性判斷,如下 object.equals object value,object value2 會呼叫第乙個引數的例項equals方法,永遠不要重寫他。object的virtualinstance equals方法 預設比較兩個物件的位址,由於這是個虛方法,所以...

JS中的boolean與相等判斷

let bool new boolean false console.log bool true console.log bool false console.log bool true console.log bool false 結果是 false,false,true,boolean那麼問題來...