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