本文是 重溫基礎 系列文章的第十八篇。
今日感覺:優化本身的代碼,也是很愉快的事情。 前端
系列目錄:git
本章節複習的是JS中的關於嚴格相等和非嚴格相等的一些知識。 github
前置知識:
判斷兩個變量的值是否相等,是編程中很是重要的一個操做。這裏咱們內心面先有兩組對照,思考下:編程
在咱們比較字符串、數值和布爾值的相等性,是比較簡單的,可是到了比較對象的時候,問題就比較複雜。
早期的時候ECMAScript規範中,在判斷相等和不相等時,會先將對象轉換成類似的類型,再執行比較。後面有人質疑其合理性,最後ECMAScript提出解決方法:提供兩組操做符:segmentfault
==
===
另外還有一類ES6新增的方法:微信
Object.is
(ES6新增)JavaScript中用相等操做符使用==
進行比較,若兩個操做數相等,則返回true
,不然返回false
。反之,不相等操做符使用!=
。
這兩個操做符都會先轉換操做數類型,再進行比較。 post
一般在轉換不一樣數據類型時,相等和不相等會遵循如下規則:學習
false
轉爲0
,true
轉爲1
。valueOf()
方法,用返回的基本類型值來判斷。兩個操做符進行比較時會遵循下面規則:優化
null
和undefined
相等。null
和undefined
轉換成其餘值。NaN
,則不相同(==
時返回false
,!=
時返回true
)。NaN
,則不相同(==
時返回false
,!=
時返回true
)。對象
,則比較它們是否是同一個對象。對象
,則相等操做符返回true
,不然返回false
。下面列出一些特殊狀況的比較 :spa
表達式 | 值 |
---|---|
null == undefined | true |
"NaN" == NaN | false |
9 == NaN | false |
NaN == NaN | false |
NaN != NaN | true |
false == 0 | true |
true == 1 | true |
true == 2 | false |
undefined == 0 | false |
null == 0 | false |
"9" == 9 | true |
除了比較前不轉換操做數歪,全等和不全等與相等和不相等並沒有區別,但使用的是===
,只有當不轉換的狀況下兩個操做數相同,纔會返回true
。
"99" == 99 ; // true 由於先轉換類型 number 和 number "99" === 99 ; // false 由於不轉換類型 string 和 number
不全等操做符就相對應的使用!==
:
"99" != 99 ; // false 由於先轉換類型 number 和 number "99" !== 99 ; // true 由於不轉換類型 string 和 number
特殊的:
null == undefined; // true 相似的值 null === undefined; // false 類型不一樣
因爲相等和不相等操做符存在類型轉換問題,所以爲了保持代碼中數據類型的完整性,咱們推薦使用去哪等和不全等操做符。
Object.is(value1, value2);
,傳入兩個須要對比的值。 Object.is()
判斷兩個值是否相同,而且不會對參數進行類型轉換。若是下列任何一項成立,則兩個值相同:
undefined
null
true
或者都是 false
兩個值都是數字而且
+0
-0
NaN
除零
和 NaN
外的其它同一個數字 Object.is('leo', 'leo'); // true Object.is(window, window); // true Object.is('leo', 'pingan'); // false Object.is([], []); // false var leo = { a: 1 }; Object.is(leo, leo); // true Object.is(null, null); // true // 特例 Object.is(0, -0); // false Object.is(-0, -0); // true Object.is(NaN, 0/0); // true
另外還有特殊的:
與同值相等相似,不過會認爲 +0
與 -0
相等。
相等操做符對於不一樣類型的值,進行的比較以下圖所示(來源 MDN):
注意:
ToNumber(A)
表示比較前將參數 A
轉換爲數字ToPrimitive(A)
經過嘗試調用 A
的A.toString()
和 A.valueOf()
方法,將參數 A
轉換爲原始值(Primitive)。
本部份內容到這結束
Author | 王平安 |
---|---|
pingan8787@qq.com | |
博 客 | www.pingan8787.com |
微 信 | pingan8787 |
每日文章推薦 | https://github.com/pingan8787... |
JS小冊 | js.pingan8787.com |
歡迎關注微信公衆號【前端自習課】天天早晨,與您一塊兒學習一篇優秀的前端技術博文 .