成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JavaScript的相等比較(==)和(===)及Object.is()的區(qū)別

王軍 / 3214人閱讀

摘要:原始類型值比較原始類型值有五種布爾值字符串?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)。

1. 非數(shù)值類型比較

值相同就返回true,值不同就返回false。

null === null        // true
null === undefined   // false
2. 數(shù)值類型比較

正常情況下值相同就返回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. 對(duì)象與數(shù)值比較時(shí),對(duì)象轉(zhuǎn)為數(shù)值 Number()
[1] == 1 // true
// 等同于 Number([1]) == 1
2. 對(duì)象與字符串比較時(shí),對(duì)象轉(zhuǎn)為字符串 String()
[1] == "1" // true
// 等同于 String([1]) == "1"
[1, 2] == "1,2" // true
// 等同于 String([1, 2]) == "1,2"
3. 對(duì)象與布爾值比較時(shí),兩邊都轉(zhuǎn)為數(shù)值
[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

相關(guān)文章

  • 前端面經(jīng)整理之JSCSS

    摘要:作為對(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)換,...

    stonezhu 評(píng)論0 收藏0
  • 前端面經(jīng)整理之JSCSS

    摘要:作為對(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)換,...

    lvzishen 評(píng)論0 收藏0
  • 【重溫基礎(chǔ)】18.相等性判斷

    摘要:通常在轉(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ǔ)...

    趙春朋 評(píng)論0 收藏0
  • 【前端工程師手冊(cè)】說(shuō)清楚JavaScript相等性判斷

    摘要:如果沒(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)...

    crossoverJie 評(píng)論0 收藏0
  • 解析JavaScript判斷兩個(gè)值相等方法

      本篇文章主要是講述在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)在就依次下面四種方法。  同值  同值零  非...

    3403771864 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<