【重溫基礎】18.相等性判斷

本文是 重溫基礎 系列文章的第十八篇。
今日感覺:優化本身的代碼,也是很愉快的事情。 前端

系列目錄:git

本章節複習的是JS中的關於嚴格相等和非嚴格相等的一些知識。 github

前置知識:
判斷兩個變量的值是否相等,是編程中很是重要的一個操做。這裏咱們內心面先有兩組對照,思考下:編程

  • 相等 和 不相等
  • 全等 和 不全等

1.介紹

在咱們比較字符串、數值和布爾值的相等性,是比較簡單的,可是到了比較對象的時候,問題就比較複雜。
早期的時候ECMAScript規範中,在判斷相等和不相等時,會先將對象轉換成類似的類型,再執行比較。後面有人質疑其合理性,最後ECMAScript提出解決方法:提供兩組操做符:segmentfault

  • 相等不相等(寬鬆相等):先轉換再比較,使用==
  • 全等不全等(嚴格相等):僅比較不轉換,使用===

另外還有一類ES6新增的方法:微信

  • Object.is (ES6新增)

2.相等和不相等

JavaScript中用相等操做符使用==進行比較,若兩個操做數相等,則返回true,不然返回false。反之,不相等操做符使用!=
這兩個操做符都會先轉換操做數類型,再進行比較post

一般在轉換不一樣數據類型時,相等和不相等會遵循如下規則:學習

  • 如有一個操做數是布爾值,則比較前會將布爾值轉換爲數值false轉爲0true轉爲1
  • 若一個操做數是字符串,另外一個是數值,則比較前會將字符串轉換爲數值
  • 若一個操做數是對象,另外一個不是,則比較前會調用valueOf()方法,用返回的基本類型值來判斷。

兩個操做符進行比較時會遵循下面規則:優化

  • nullundefined相等。
  • 比較前不能講nullundefined轉換成其餘值。
  • 若一個操做數是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

3.全等和不全等

除了比較前不轉換操做數歪,全等和不全等與相等和不相等並沒有區別,但使用的是===,只有當不轉換的狀況下兩個操做數相同,纔會返回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 類型不一樣

因爲相等和不相等操做符存在類型轉換問題,所以爲了保持代碼中數據類型的完整性,咱們推薦使用去哪等和不全等操做符。

4.同值相等(Object.is)

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 相等。

5.對比圖

相等操做符對於不一樣類型的值,進行的比較以下圖所示(來源 MDN):

MDN 相等1

注意:

  • ToNumber(A) 表示比較前將參數 A 轉換爲數字
  • ToPrimitive(A)經過嘗試調用 AA.toString()A.valueOf() 方法,將參數 A 轉換爲原始值(Primitive)。

MDN 相等2

MDN 相等3

MDN 相等4

參考文章:

  1. MDN JavaScript 中的相等性判斷
  2. JavaScript高級程序設計

本部份內容到這結束

Author 王平安
E-mail pingan8787@qq.com
博 客 www.pingan8787.com
微 信 pingan8787
每日文章推薦 https://github.com/pingan8787...
JS小冊 js.pingan8787.com

歡迎關注微信公衆號【前端自習課】天天早晨,與您一塊兒學習一篇優秀的前端技術博文 .

相關文章
相關標籤/搜索