摘要:通常在轉換不同數據類型時,相等和不相等會遵循以下規則若有一個操作數是布爾值,則比較前會將布爾值轉換為數值轉為,轉為。
本文是 重溫基礎 系列文章的第十八篇。
今日感受:優化自己的代碼,也是很愉快的事情。
系列目錄:
【復習資料】ES6/ES7/ES8/ES9資料整理(個人整理)
【重溫基礎】1-14篇
【重溫基礎】15.JS對象介紹
【重溫基礎】16.JSON對象介紹
【重溫基礎】17.WebAPI介紹
本章節復習的是JS中的關于嚴格相等和非嚴格相等的一些知識。
前置知識:
判斷兩個變量的值是否相等,是編程中非常重要的一個操作。這里我們心里面先有兩組對照,思考下:
相等 和 不相等
全等 和 不全等
1.介紹在我們比較字符串、數值和布爾值的相等性,是比較簡單的,但是到了比較對象的時候,問題就比較復雜。
早期的時候ECMAScript規范中,在判斷相等和不相等時,會先將對象轉換成相似的類型,再執行比較。后面有人質疑其合理性,最后ECMAScript提出解決方法:提供兩組操作符:
相等和不相等(寬松相等):先轉換再比較,使用==
全等和不全等(嚴格相等):僅比較不轉換,使用===
另外還有一類ES6新增的方法:
Object.is (ES6新增)
2.相等和不相等JavaScript中用相等操作符使用==進行比較,若兩個操作數相等,則返回true,否則返回false。反之,不相等操作符使用!=。
這兩個操作符都會先轉換操作數類型,再進行比較。
通常在轉換不同數據類型時,相等和不相等會遵循以下規則:
若有一個操作數是布爾值,則比較前會將布爾值轉換為數值:false轉為0,true轉為1。
若一個操作數是字符串,另一個是數值,則比較前會將字符串轉換為數值。
若一個操作數是對象,另一個不是,則比較前會調用valueOf()方法,用返回的基本類型值來判斷。
兩個操作符進行比較時會遵循下面規則:
null和undefined相等。
比較前不能講null和undefined轉換成其他值。
若一個操作數是NaN,則不相同(==時返回false,!=時返回true)。
若兩個操作數是NaN,則不相同(==時返回false,!=時返回true)。
若兩個操作數都是對象,則比較它們是不是同一個對象。
若兩個操作數都指向同一個對象,則相等操作符返回true,否則返回false。
下面列出一些特殊情況的比較 :
表達式 | 值 |
---|---|
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 類型不同
由于相等和不相等操作符存在類型轉換問題,因此為了保持代碼中數據類型的完整性,我們推薦使用去哪等和不全等操作符。
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):
注意:
ToNumber(A) 表示比較前將參數 A 轉換為數字
ToPrimitive(A)通過嘗試調用 A 的A.toString() 和 A.valueOf() 方法,將參數 A 轉換為原始值(Primitive)。
參考文章:MDN JavaScript 中的相等性判斷
JavaScript高級程序設計
本部分內容到這結束
Author | 王平安 |
---|---|
pingan8787@qq.com | |
博 客 | www.pingan8787.com |
微 信 | pingan8787 |
每日文章推薦 | https://github.com/pingan8787... |
JS小冊 | js.pingan8787.com |
歡迎關注微信公眾號【前端自習課】每天早晨,與您一起學習一篇優秀的前端技術博文 .
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/101316.html
摘要:系列目錄復習資料資料整理個人整理重溫基礎篇重溫基礎對象介紹重溫基礎對象介紹重溫基礎介紹重溫基礎相等性判斷本章節復習的是中的關于閉包,這個小哥哥呀,看看。這里隨著閉包函數的結束,執行環境銷毀,變量回收。 本文是 重溫基礎 系列文章的第十九篇。今日感受:將混亂的事情找出之間的聯系,也是種能力。 系列目錄: 【復習資料】ES6/ES7/ES8/ES9資料整理(個人整理) 【重溫基礎】...
摘要:內存泄露內存泄露概念在計算機科學中,內存泄漏指由于疏忽或錯誤造成程序未能釋放已經不再使用的內存。判斷內存泄漏,以字段為準。 本文是 重溫基礎 系列文章的第二十二篇。 今日感受:優化學習方法。 系列目錄: 【復習資料】ES6/ES7/ES8/ES9資料整理(個人整理) 【重溫基礎】1-14篇 【重溫基礎】15.JS對象介紹 【重溫基礎】16.JSON對象介紹 【重溫基礎】1...
摘要:歡迎您的支持系列目錄復習資料資料整理個人整理重溫基礎篇重溫基礎對象介紹重溫基礎對象介紹重溫基礎介紹重溫基礎相等性判斷重溫基礎閉包重溫基礎事件本章節復習的是中的高階函數,可以提高我們的開發效率。 本文是 重溫基礎 系列文章的第二十一篇。 今日感受:想家。 本人自己整理的【Cute-JavaScript】資料,包含:【ES6/ES7/ES8/ES9】,【JavaScript基礎...
摘要:系列目錄復習資料資料整理個人整理重溫基礎語法和數據類型重溫基礎流程控制和錯誤處理重溫基礎循環和迭代重溫基礎函數本章節復習的是中的表達式和運算符,用好這些可以大大提高開發效率。 本文是 重溫基礎 系列文章的第五篇。今日感受:家的意義。 系列目錄: 【復習資料】ES6/ES7/ES8/ES9資料整理(個人整理) 【重溫基礎】1.語法和數據類型 【重溫基礎】2.流程控制和錯誤處理 【重溫基...
摘要:本文是重溫基礎系列文章的第二十篇。事件捕獲為截獲事件提供機會,然后實際的目標接收到事件,最后事件冒泡,對事件作出響應。事件處理事件處理,即響應某個事件。包括導致事件的元素事件類型等其他信息。 本文是 重溫基礎 系列文章的第二十篇。 這是第三個基礎系列的第一篇,歡迎持續關注呀! 重溫基礎 系列的【初級】和【中級】的文章,已經統一整理到我的【Cute-JavaScript】的Java...
閱讀 2453·2021-11-23 09:51
閱讀 503·2019-08-30 13:59
閱讀 1820·2019-08-29 11:20
閱讀 2529·2019-08-26 13:41
閱讀 3238·2019-08-26 12:16
閱讀 729·2019-08-26 10:59
閱讀 3321·2019-08-26 10:14
閱讀 602·2019-08-23 17:21