摘要:原始類型值比較原始類型值有五種布爾值字符串數值。用來比較兩個值是否嚴格相等,與嚴格比較運算符的行為基本一致。返回布爾值,相等返回,不相等返回。
比較運算符之相等運算符
ES5 比較兩個值是否相等,只有兩個運算符:相等運算符(==)和嚴格相等運算符(===)。前者在比較時對于不同數據類型的值會進行類型轉換;而后者不會轉換,且結果更容易預測,并且因為沒有隱式轉換,全等比較的運行會更快。因此建議使用嚴格相等運算符===進行值的比較。
嚴格相等運算符 === (1) 不同類型的值比較如果比較的兩個值的類型不同,直接返回false。
1 === "1" // false true === "true" // false(2) 原始類型值比較
原始類型值有五種:undefined、null、布爾值(Boolean)、字符串(String)、數值(Number)。
值相同就返回true,值不同就返回false。
null === null // true null === undefined // false
正常情況下值相同就返回true,值不同就返回false。但有兩個特殊情況:
一是0不分正負
0 === -0 //true
二是 NaN 本身不全等于任何值。
NaN === NaN //false NaN !== NaN //true
也就是說 等式 (x !== x) 成立的唯一情況是 x 的值為 NaN。
(3) 復合類型值比較復合類型的值實際上存儲的是數據的內存地址,因此兩個復合類型(對象、數組、函數)的數據比較時,不是比較它們的值是否相等,而是比較它們是否指向同一個地址。
{} === {} // false [] === [] // false (function () {} === function () {}) // false
上面代碼分別比較兩個空對象、兩個空數組、兩個空函數,結果都是不相等。那是因為空對象、空數組、空函數的值,都存放在不同的內存地址,因此結果是false。
而如果兩個變量引用同一個對象,那它們則相等,因為它們引用的對象存儲在同一個內存地址。
var v1 = {}; var v2 = v1; v1 === v2 // true相等運算符 ==
相等運算符用來比較相同類型的數據以及復合類型數據時,與嚴格相等運算符完全一樣。比較不同類型的數據時,相等運算符會先將數據進行類型轉換,然后再用嚴格相等運算符比較。
(1) 原始類型值比較原始類型的值會轉換成數值再進行比較。轉換規則是使用 Number() 轉換。
1 == true // true // 等同于 1 === Number(true) 0 == false // true // 等同于 0 === Number(false) "true" == true // false // 等同于 Number("true") === Number(true) "" == 0 // true // 等同于 Number("") === 0 "" == false // true // 等同于 0 === 0 " 123 " == 123 // true // 因為字符串轉為數字時,省略前置和后置的空格(2) undefined 和 null
undefined 和 null 與其他類型的值比較時,結果都為 false,它們互相比較時結果為 true。
false == null // false false == undefined // false 0 == null // false 0 == undefined // false NaN == undefined // false undefined == null // true(3) 對象與原始類型值比較
對象(這里指廣義的對象,包括數組和函數)與原始類型的值比較時,對象轉換成原始類型的值,再進行比較。
[1] == 1 // true // 等同于 Number([1]) == 1
[1] == "1" // true // 等同于 String([1]) == "1" [1, 2] == "1,2" // true // 等同于 String([1, 2]) == "1,2"
[1] == true // true // 等同于 Number([1]) == Number(true) [2] == true // false // 等同于 Number([2]) == Number(true)Object.is(value1, value2)
相等運算符(==)和嚴格相等運算符(===)都有缺點,前者會自動轉換數據類型,后者的NaN不等于自身,以及+0等于-0。因此 ES6 的新方法Object.is可以用來解決這個問題。
Object.is 用來比較兩個值是否嚴格相等,與嚴格比較運算符(===)的行為基本一致。返回布爾值,相等返回 true,不相等返回 false。
不同之處只有兩個:一是+0不等于-0,二是NaN等于自身。
+0 === -0 //true NaN === NaN // false Object.is(+0, -0) // false Object.is(NaN, NaN) // true
對于不兼容 ES6 的瀏覽器,可以在ES5 環境下通過下面的代碼,部署Object.is。
Object.defineProperty(Object, "is", { value: function(x, y) { if (x === y) { // 針對+0 不等于 -0的情況 return x !== 0 || 1 / x === 1 / y; } // 針對NaN的情況 return x !== x && y !== y; }, configurable: true, enumerable: false, writable: true });
判斷相等一覽表
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/98896.html
摘要:作為對象原型鏈的終點。調用函數時,應該提供的參數沒有提供,該參數等于。它可以用于引用該函數的函數體內當前正在執行的函數。 一 JS 二 CSS 一 JS ==和===的區別 ===叫做嚴格運算符 ==叫做相等運算符嚴格運算符比較時不僅僅比較數值還要比較數據類型是否一樣相等運算符在比較相同類型的數據時,與嚴格相等運算符完全一樣。 在比較不同類型的數據時,相等運算符會先將數據進行類型轉換,...
摘要:作為對象原型鏈的終點。調用函數時,應該提供的參數沒有提供,該參數等于。它可以用于引用該函數的函數體內當前正在執行的函數。 一 JS 二 CSS 一 JS ==和===的區別 ===叫做嚴格運算符 ==叫做相等運算符嚴格運算符比較時不僅僅比較數值還要比較數據類型是否一樣相等運算符在比較相同類型的數據時,與嚴格相等運算符完全一樣。 在比較不同類型的數據時,相等運算符會先將數據進行類型轉換,...
摘要:通常在轉換不同數據類型時,相等和不相等會遵循以下規則若有一個操作數是布爾值,則比較前會將布爾值轉換為數值轉為,轉為。 本文是 重溫基礎 系列文章的第十八篇。今日感受:優化自己的代碼,也是很愉快的事情。 系列目錄: 【復習資料】ES6/ES7/ES8/ES9資料整理(個人整理) 【重溫基礎】1-14篇 【重溫基礎】15.JS對象介紹 【重溫基礎】16.JSON對象介紹 【重溫基礎...
摘要:如果沒有傳入的話如果是類型,則取否則,取這個方法大致和一樣,除了以下返回返回參考知乎中和區別是什么全面解析中的數據類型與類型轉換規范 有哪些判斷相等性的方法 JavaScript現在提供了三種方法來判斷相等性: ===,三個等號即嚴格相等 ==,兩個等號即寬松相等 Object.is(),ES6中用來判斷相等的方法 判斷相等性的細節 ===(嚴格相等) 被比較的兩個數不會進行類型轉...
本篇文章主要是講述在JavaScript中判斷兩個值相等,不要認為很簡單,要注意的是在JavaScript中存在4種不同的相等邏輯。 ECMAScript 是 JavaScript 的語言規范,在ECMAScript 規范中存在四種相等算法,如下圖所示: 上圖中每個依次寫下來,很多前端應該熟悉嚴格相等和非嚴格相等,但對于同值零和同值卻不熟悉,現在就依次下面四種方法。 同值 同值零 非...
閱讀 2488·2021-08-11 11:16
閱讀 2926·2019-08-30 15:55
閱讀 3332·2019-08-30 12:53
閱讀 1568·2019-08-29 13:28
閱讀 3264·2019-08-28 18:17
閱讀 935·2019-08-26 12:19
閱讀 2466·2019-08-23 18:27
閱讀 695·2019-08-23 18:17