關(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á)的很清楚:
圖中綠色的方框表示返回的值為true挚币,其它的表示返回的值為false。同樣可以使用另一張圖來(lái)表述:
圖中橙色的方框表示返回的值為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á):
上圖中綠色的方框表示返回的值為true存璃,白色的方框表示返回的值為false。除了上圖之外雕拼,下面這張圖也表達(dá)的是同樣的意思:
上圖中橙色的方框表示返回的值為true纵东,白色的方框表示返回的值為false。
在JavaScript中比較運(yùn)算符不僅僅是==和===啥寇。還有其它的比較運(yùn)算符偎球,比如<=、>=辑甜。綜合起來(lái)衰絮,也可以使用一張圖表述:
紅色:===
橙色:==
黃色:<=和>=同時(shí)成立,==不成立
藍(lán)色:只有>=
綠色:只有<=
!= 和 !==
在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)格相等主籍。