最近發現乙個比較神奇的問題如下:
== 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那麼問題來...