JavaScript中的==和===

關(guān)系表達(dá)式

==和===都是JavaScript中的關(guān)系表達(dá)式運(yùn)算符,與對(duì)應(yīng)的還有!=和!==导狡。

==和===運(yùn)算符主要用于比較兩個(gè)值是否相等筹燕。當(dāng)然它們對(duì)相等的定義不盡相同。兩個(gè)運(yùn)算符允許任意類(lèi)型的操作數(shù)密任,如果操作數(shù)相等則返回true,否則返回false偷俭。

==和===定義

==和===雖然都是關(guān)系表達(dá)式運(yùn)算符浪讳,但它們的定義是有所不同的:

  • ==:稱作相等運(yùn)算符(Equality Operator),它用來(lái)檢測(cè)兩個(gè)操作是否相等涌萤,這里的相等的定義非常寬松淹遵,可以允許類(lèi)型的轉(zhuǎn)換

  • ===:稱作嚴(yán)格相等運(yùn)算符(Strict Equality),也被稱之為恒等運(yùn)算符(Identity Operator)或全等運(yùn)算符负溪,它用來(lái)檢測(cè)兩個(gè)操作數(shù)是否嚴(yán)格相等

== 和 ===運(yùn)算規(guī)則

JavaScript中==和===運(yùn)算符透揣,它們的運(yùn)算都具有自己的運(yùn)算規(guī)則。

==運(yùn)算規(guī)則

==運(yùn)算符對(duì)于兩個(gè)數(shù)比較并不嚴(yán)格川抡。如果兩個(gè)操作數(shù)不是同一類(lèi)型淌实,那么相等運(yùn)算符會(huì)嘗試進(jìn)行一些類(lèi)型轉(zhuǎn)換,然后進(jìn)行比較猖腕。

在轉(zhuǎn)換不同的數(shù)據(jù)類(lèi)型時(shí)拆祈,其會(huì)遵循下列基本原則:

如果兩個(gè)操作數(shù)的類(lèi)型相同,則會(huì)按照嚴(yán)格相等的比較規(guī)則一樣倘感,如果嚴(yán)格相等放坏,那么比較結(jié)果為相等。如果它們不嚴(yán)格相等老玛,則比較結(jié)果為不相等淤年。

如果兩個(gè)操作數(shù)的類(lèi)型不同,==相等操作符也可能會(huì)認(rèn)為它們相等蜡豹。檢測(cè)相等將會(huì)遵守下面的規(guī)則和類(lèi)型轉(zhuǎn)換:

如果一個(gè)值是null, 另一個(gè)是undefined麸粮,則它們是相等:

null == undefined; // => true

如果一個(gè)值是數(shù)字,另一個(gè)是字符串镜廉,先將字符串轉(zhuǎn)換為數(shù)值弄诲,然后使用轉(zhuǎn)換后的值進(jìn)行比較:

1 == '1'; // => true

如果其中一個(gè)值是true,則將其轉(zhuǎn)換為1再進(jìn)行比較。如果其中一個(gè)值是false齐遵,則將其轉(zhuǎn)換為0再進(jìn)行比較:

true == 0;   // => false
false == 1;  // => false
true == 1;   // => true
false == 0;  // => true
true == '1'; // => true
false == '0';// => true

如果一個(gè)值是對(duì)象寂玲,另一個(gè)值是數(shù)字或字符串,將會(huì)先使用toString()和valueOf()將對(duì)象轉(zhuǎn)換為原始值梗摇,然后再進(jìn)行比較拓哟。

兩個(gè)操作數(shù)在進(jìn)行比較時(shí)則要遵循下列規(guī)則:

  • null和undefined是相等的

  • 要比較相等性之前,不能將null和undefined轉(zhuǎn)換成其他任何值

  • 如果有一個(gè)操作是NaN伶授,則相等操作符返回false,而不相等操作符返回true断序。重要提示: 即使兩個(gè)操作數(shù)都是NaN,相等操作符也返回false糜烹,因?yàn)榘凑找?guī)則 违诗,NaN不等于NaN

  • 如果兩個(gè)操作數(shù)都是對(duì)象,則比較它們是不是同一個(gè)對(duì)象景图。如果兩個(gè)操作數(shù)都指向同一個(gè)對(duì)象,則相等操作符返回true碉哑,否則返回false

來(lái)看一下對(duì)象的比較:

var a = [1,2,3];
var b = [1,2,3];

var c = { x: 1, y: 2 };
var d = { x: 1, y: 2 };

var e = "text";
var f = "te" + "xt";

a == b       // =>false
c == d       // =>false
e == f       // =>true

對(duì)于兩個(gè)操作數(shù)var1==var2,下圖能表達(dá)的很清楚:

Paste_Image.png

圖中綠色的方框表示返回的值為true挚币,其它的表示返回的值為false。同樣可以使用另一張圖來(lái)表述:

Paste_Image.png

圖中橙色的方框表示返回的值為true扣典,其它的表示返回的值為false妆毕。

===運(yùn)算規(guī)則

嚴(yán)格相等運(yùn)算符===首先要計(jì)算其操作數(shù)的值,然后比較這兩個(gè)值贮尖,比較過(guò)程沒(méi)有任何類(lèi)型轉(zhuǎn)換笛粘。其運(yùn)算規(guī)則遵循下面的規(guī)則:

如果兩個(gè)值類(lèi)型不相同,則它們不相等

true === '1'; // => false

其中操作數(shù)true是布爾值湿硝,而'1'是字符串值薪前。

如果兩個(gè)者都是null或者都是undefined,則它們相等:

null === null; // => true
undefined === undefined; // => true
null === undefined; // =>false

如果兩個(gè)值都是布爾值true或false关斜,則它們相等:

true === true;   // =>true
false === false; // =>true
true === 1;      // =>false
true === '1';    // =>false
false === 0;     // =>false
false === '0';   // =>false

如果其中一個(gè)值是NaN,或者兩個(gè)值都是NaN示括,則它們不相等。NaN和其他任何值都是不相等的痢畜,包括它本身垛膝。通過(guò)x !== x來(lái)判斷x是否為NaN,只有在x為NaN的時(shí)候丁稀,這個(gè)表達(dá)式的值才為true吼拥。

如果兩個(gè)值為數(shù)字且數(shù)值相等,則它們相等线衫。如果一個(gè)值為0凿可,另一個(gè)值為-0,則它們同樣的相等授账。

如果兩個(gè)值為字符串矿酵,且所含的對(duì)應(yīng)位上的16位數(shù)完全相等唬复,則它們相等。如果它們的長(zhǎng)度或內(nèi)容不同全肮,則它們不等敞咧。兩個(gè)字符串可能含義完全一樣且所顯示出的字符也一樣,但且有不同編碼的16位值辜腺。JavaScript并不對(duì)Unicode進(jìn)行標(biāo)準(zhǔn)化的轉(zhuǎn)換休建,因此像這樣的字符串通過(guò)===和==運(yùn)算符的比較結(jié)果也不相等。在JavaScript中字符串的比較提供了一個(gè)String.localeCompare()方法评疗。

如果兩個(gè)引用值指向同一個(gè)對(duì)象测砂,數(shù)組或函數(shù),則它們是相等的百匆。如果指向不同的對(duì)象砌些,則它們是不等的,盡管兩個(gè)對(duì)象具有完全一樣的屬性加匈。

var a = [1,2,3];
var b = [1,2,3];
var c = a;

var ab_eq = (a === b); // false (even though a and b are the same type)
var ac_eq = (a === c); // true

var a = { x: 1, y: 2 };
var b = { x: 1, y: 2 };
var c = a;

var ab_eq = (a === b); // false (even though a and b are the same type)
var ac_eq = (a === c); // true

var a = { };
var b = { };
var c = a;

var ab_eq = (a === b); // false (even though a and b are the same type)
var ac_eq = (a === c); // true

同樣對(duì)于var1 === var2也可以用圖來(lái)表達(dá):

Paste_Image.png

上圖中綠色的方框表示返回的值為true存璃,白色的方框表示返回的值為false。除了上圖之外雕拼,下面這張圖也表達(dá)的是同樣的意思:

Paste_Image.png

上圖中橙色的方框表示返回的值為true纵东,白色的方框表示返回的值為false。

在JavaScript中比較運(yùn)算符不僅僅是==和===啥寇。還有其它的比較運(yùn)算符偎球,比如<=、>=辑甜。綜合起來(lái)衰絮,也可以使用一張圖表述:

  • 紅色:===

  • 橙色:==

  • 黃色:<=和>=同時(shí)成立,==不成立

  • 藍(lán)色:只有>=

  • 綠色:只有<=

Paste_Image.png

!= 和 !==

在JavaScript中還有兩個(gè)運(yùn)算符和==磷醋、===類(lèi)似岂傲,它們是!=和!===。在JavaScript中子檀,!=和!==運(yùn)算符的檢測(cè)是==和===運(yùn)算符的求反镊掖。如果兩個(gè)值通過(guò)==的比較結(jié)果為true,那么通過(guò)!=的比較結(jié)果則為false褂痰。如果兩個(gè)值通過(guò)===的比較結(jié)果為true亩进,那么通過(guò)!==的比較結(jié)果則為false。

總結(jié)

這篇文章簡(jiǎn)單的總結(jié)了JavaScript中的==和===運(yùn)算符的規(guī)則缩歪,以前這兩個(gè)運(yùn)算符中不同之處归薛。簡(jiǎn)單的只需要記住==表示兩個(gè)操作數(shù)相同,===表示來(lái)格相等(恒等或全等),!=稱為不相等,!==表示不嚴(yán)格相等主籍。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末习贫,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子千元,更是在濱河造成了極大的恐慌苫昌,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件幸海,死亡現(xiàn)場(chǎng)離奇詭異祟身,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)物独,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)袜硫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人挡篓,你說(shuō)我怎么就攤上這事婉陷。” “怎么了官研?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵秽澳,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我阀参,道長(zhǎng)肝集,這世上最難降的妖魔是什么瞻坝? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任蛛壳,我火速辦了婚禮,結(jié)果婚禮上所刀,老公的妹妹穿的比我還像新娘衙荐。我一直安慰自己,他們只是感情好浮创,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布忧吟。 她就那樣靜靜地躺著,像睡著了一般斩披。 火紅的嫁衣襯著肌膚如雪溜族。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,760評(píng)論 1 289
  • 那天垦沉,我揣著相機(jī)與錄音煌抒,去河邊找鬼。 笑死厕倍,一個(gè)胖子當(dāng)著我的面吹牛寡壮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼况既,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼这溅!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起棒仍,我...
    開(kāi)封第一講書(shū)人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤悲靴,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后降狠,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體对竣,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年榜配,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了否纬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蛋褥,死狀恐怖临燃,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情烙心,我是刑警寧澤膜廊,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站淫茵,受9級(jí)特大地震影響爪瓜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜匙瘪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一铆铆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧丹喻,春花似錦薄货、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至鳍悠,卻和暖如春税娜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背藏研。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工敬矩, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人遥倦。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓谤绳,卻偏偏與公主長(zhǎng)得像占锯,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子缩筛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理消略,服務(wù)發(fā)現(xiàn),斷路器瞎抛,智...
    卡卡羅2017閱讀 134,628評(píng)論 18 139
  • 表達(dá)式 表達(dá)式是由數(shù)字艺演、運(yùn)算符、數(shù)字分組符號(hào)(如括號(hào))桐臊、自由變量和約束變量等以能求得數(shù)值的有意義排列方法所得的組合...
    劼哥stone閱讀 560評(píng)論 0 4
  • 表達(dá)式和運(yùn)算符 程序中最簡(jiǎn)單的表達(dá)式就是胎撤,程序中的常量 變量名也是一種簡(jiǎn)單的表達(dá)式 復(fù)雜的表達(dá)式是由簡(jiǎn)單的表達(dá)式組...
    zhaolion閱讀 1,628評(píng)論 3 12
  • FreeCodeCamp - Basic JavaScript 寫(xiě)在前面: 我曾經(jīng)在進(jìn)谷前刷過(guò)這一套題,不過(guò)當(dāng)時(shí)只...
    付林恒閱讀 16,431評(píng)論 5 28
  • 2015年2月13日断凶,外婆去世伤提。 我是一個(gè)懼怕死亡的人,卻在那個(gè)寒假认烁,感受著死亡肿男,只感覺(jué)到痛,但痛到麻木却嗡。 一直很...
    MaimaiWu閱讀 810評(píng)論 1 11