JS中==和===的區(qū)別

JavaScript 提供兩種相等運(yùn)算符:==和===。

簡(jiǎn)單說茸习,它們的區(qū)別是相等運(yùn)算符(==)比較兩個(gè)值是否相等柔逼,嚴(yán)格相等運(yùn)算符(===)比較它們是否為“同一個(gè)值”。如果兩個(gè)值不是同一類型撵术,嚴(yán)格相等運(yùn)算符(===)直接返回false背率,而相等運(yùn)算符(==)會(huì)將它們轉(zhuǎn)換成同一個(gè)類型,再用嚴(yán)格相等運(yùn)算符進(jìn)行比較。

嚴(yán)格相等運(yùn)算符

嚴(yán)格相等運(yùn)算符的算法如下:

  1. 不同類型的值
    如果兩個(gè)值的類型不同寝姿,直接返回false交排。
1 === "1" // false
true === "true" // false

上面代碼比較數(shù)值的1與字符串的“1”、布爾值的true與字符串"true"饵筑,因?yàn)轭愋筒煌BǎY(jié)果都是false。

  1. 同一類的原始類型值
    同一類型的原始類型的值(數(shù)值根资、字符串架专、布爾值)比較時(shí),值相同就返回true玄帕,值不同就返回false部脚。
1 === 0x1 // true

上面代碼比較十進(jìn)制的1與十六進(jìn)制的1,因?yàn)轭愋秃椭刀枷嗤阄疲祷豻rue委刘。
需要注意的是,NaN與任何值都不相等(包括自身)鹰椒。另外锡移,正0等于負(fù)0。

NaN === NaN  // false
+0 === -0 // true
  1. 復(fù)合類型值
    兩個(gè)復(fù)合類型(對(duì)象漆际、數(shù)組淆珊、函數(shù))的數(shù)據(jù)比較時(shí),不是比較它們的值是否相等奸汇,而是比較它們是否指向同一個(gè)地址施符。
{} === {} // false
[] === [] // false
(function () {} === function () {}) // false

上面代碼分別比較兩個(gè)空對(duì)象、兩個(gè)空數(shù)組擂找、兩個(gè)空函數(shù)操刀,結(jié)果都是不相等。原因是對(duì)于復(fù)合類型的值婴洼,嚴(yán)格相等運(yùn)算比較的是骨坑,它們是否引用同一個(gè)內(nèi)存地址,而運(yùn)算符兩邊的空對(duì)象柬采、空數(shù)組欢唾、空函數(shù)的值,都存放在不同的內(nèi)存地址粉捻,結(jié)果當(dāng)然是false礁遣。

如果兩個(gè)變量引用同一個(gè)對(duì)象,則它們相等肩刃。

var v1 = {};
var v2 = v1;
v1 === v2 // true

注意祟霍,對(duì)于兩個(gè)對(duì)象的比較杏头,嚴(yán)格相等運(yùn)算符比較的是地址,而大于或小于運(yùn)算符比較的是值沸呐。

new Date() > new Date() // false
new Date() < new Date() // false
new Date() === new Date() // false

上面的三個(gè)表達(dá)式醇王,前兩個(gè)比較的是值,最后一個(gè)比較的是地址崭添,所以都返回false寓娩。

  1. undefined 和 null
    undefined和null與自身嚴(yán)格相等。
undefined === undefined // true
null === null // true

由于變量聲明后默認(rèn)值是undefined呼渣,因此兩個(gè)只聲明未賦值的變量是相等的棘伴。

var v1;
var v2;
v1 === v2 // true
  1. 嚴(yán)格不相等運(yùn)算符
    嚴(yán)格相等運(yùn)算符有一個(gè)對(duì)應(yīng)的“嚴(yán)格不相等運(yùn)算符”(!==),它的算法就是先求嚴(yán)格相等運(yùn)算符的結(jié)果屁置,然后返回相反值焊夸。
1 !== '1' // true

相等運(yùn)算符

相等運(yùn)算符用來比較相同類型的數(shù)據(jù)時(shí),與嚴(yán)格相等運(yùn)算符完全一樣蓝角。

比較不同類型的數(shù)據(jù)時(shí)淳地,相等運(yùn)算符會(huì)先將數(shù)據(jù)進(jìn)行類型轉(zhuǎn)換,然后再用嚴(yán)格相等運(yùn)算符比較帅容。類型轉(zhuǎn)換規(guī)則如下。

  1. 原始類型的值
    原始類型的數(shù)據(jù)會(huì)轉(zhuǎn)換成數(shù)值類型再進(jìn)行比較伍伤。
1 == true // true
// 等同于 1 === Number(true)

0 == false // true
// 等同于 0 === Number(false)

2 == true // false
// 等同于 2 === Number(true)

2 == false // false
// 等同于 2 === Number(false)

'true' == true // false
// 等同于 Number('true') === Number(true)
// 等同于 NaN === 1

'' == 0 // true
// 等同于 Number('') === 0
// 等同于 0 === 0

'' == false  // true
// 等同于 Number('') === Number(false)
// 等同于 0 === 0

'1' == true  // true
// 等同于 Number('1') === Number(true)
// 等同于 1 === 1

'\n  123  \t' == 123 // true
// 因?yàn)樽址D(zhuǎn)為數(shù)字時(shí)并徘,省略前置和后置的空格

上面代碼將字符串和布爾值都轉(zhuǎn)為數(shù)值,然后再進(jìn)行比較扰魂。

  1. 對(duì)象與原始類型值比較
    對(duì)象(這里指廣義的對(duì)象麦乞,包括數(shù)組和函數(shù))與原始類型的值比較時(shí),對(duì)象轉(zhuǎn)化成原始類型的值劝评,再進(jìn)行比較姐直。
[1] == 1 // true
// 等同于 Number([1]) == 1

[1] == '1' // true
// 等同于 Number([1]) == Number('1')

[1] == true // true
// 等同于 Number([1]) == Number(true)

上面代碼中,數(shù)組[1]與數(shù)值進(jìn)行比較蒋畜,會(huì)先轉(zhuǎn)成數(shù)值声畏,再進(jìn)行比較;與字符串進(jìn)行比較姻成,會(huì)先轉(zhuǎn)成數(shù)值插龄,然后再與字符串進(jìn)行比較,這時(shí)字符串也會(huì)轉(zhuǎn)成數(shù)值科展;與布爾值進(jìn)行比較均牢,兩個(gè)運(yùn)算子都會(huì)先轉(zhuǎn)成數(shù)值,然后再進(jìn)行比較才睹。

  1. undefined 和 null
    undefined和null與其他類型的值比較時(shí)徘跪,結(jié)果都為false甘邀,它們互相比較時(shí)結(jié)果為true。
false == null // false
false == undefined // false

0 == null // false
0 == undefined // false

undefined == null // true

絕大多數(shù)情況下垮庐,對(duì)象與undefined和null比較松邪,都返回false。只有在對(duì)象轉(zhuǎn)為原始值得到undefined時(shí)突硝,才會(huì)返回true测摔,這種情況是非常罕見的。

  1. 相等運(yùn)算符的缺點(diǎn)
    相等運(yùn)算符隱藏的類型轉(zhuǎn)換解恰,會(huì)帶來一些違反直覺的結(jié)果锋八。
0 == ''             // true
0 == '0'            // true

2 == true           // false
2 == false          // false

false == 'false'    // false
false == '0'        // true

false == undefined  // false
false == null       // false
null == undefined   // true

' \t\r\n ' == 0     // true

上面這些表達(dá)式都很容易出錯(cuò),因此不要使用相等運(yùn)算符(==)护盈,最好只使用嚴(yán)格相等運(yùn)算符(===)挟纱。

  1. 不相等運(yùn)算符
    相等運(yùn)算符有一個(gè)對(duì)應(yīng)的“不相等運(yùn)算符”(!=),兩者的運(yùn)算結(jié)果正好相反腐宋。
1 != '1' // false

原文:https://javascript.ruanyifeng.com/grammar/operator.html#toc6

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末紊服,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子胸竞,更是在濱河造成了極大的恐慌欺嗤,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卫枝,死亡現(xiàn)場(chǎng)離奇詭異煎饼,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)校赤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門吆玖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人马篮,你說我怎么就攤上這事沾乘。” “怎么了浑测?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵翅阵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我迁央,道長(zhǎng)怎顾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任漱贱,我火速辦了婚禮槐雾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘幅狮。我一直安慰自己募强,他們只是感情好株灸,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著擎值,像睡著了一般慌烧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鸠儿,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天屹蚊,我揣著相機(jī)與錄音,去河邊找鬼进每。 笑死汹粤,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的田晚。 我是一名探鬼主播嘱兼,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼贤徒!你這毒婦竟也來了芹壕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤接奈,失蹤者是張志新(化名)和其女友劉穎踢涌,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體序宦,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡睁壁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了挨厚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡糠惫,死狀恐怖疫剃,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情硼讽,我是刑警寧澤巢价,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站固阁,受9級(jí)特大地震影響壤躲,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜备燃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一碉克、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧并齐,春花似錦漏麦、人聲如沸客税。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽更耻。三九已至,卻和暖如春捏膨,著一層夾襖步出監(jiān)牢的瞬間秧均,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工号涯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留目胡,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓诚隙,卻偏偏與公主長(zhǎng)得像讶隐,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子久又,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353