js運(yùn)算符之有貓病的if判斷和==判斷

初學(xué)js時(shí)菌瘫,發(fā)現(xiàn)if()中判斷的結(jié)果和==的判斷結(jié)果竟然不太一樣誒奈偏,真的是非常地有貓病了飞几。下面根據(jù)js的6中數(shù)據(jù)類型后室,對兩者進(jìn)行對比說明缩膝!

1. if()的判斷

括號里的數(shù)據(jù)強(qiáng)制轉(zhuǎn)化成Boolean來判斷

數(shù)據(jù)類型 結(jié)果
Undefined false
Null false
Boolean 輸入即輸出
Number +0, ?0, NaN為false;其余為true
String ""為false( length 是0);其余為true
Object object為null或undefined時(shí)岸霹,為false疾层;否則為true.

2. == 判斷

2.1 對于左右兩端數(shù)據(jù)類型一致的,==操作與===操作是一致的贡避。

需要注意的是:

  • NaN == NaN 返回false
  • Undefined == Undefined 返回true
  • Null == Null 返回true
  • == 兩端為非空對象時(shí)痛黎,兩個(gè)對象內(nèi)存地址一致時(shí)返回true予弧,否則返回false

2.2 對于左右兩端數(shù)據(jù)類型不一致的,需要對數(shù)據(jù)進(jìn)行轉(zhuǎn)化湖饱。

轉(zhuǎn)化規(guī)則如下:

一端(x) 另一端(y) 結(jié)果
Null Undefined true
Number String x == toNumber(y)
Boolean (any) toNumber(x) == y
Number Object x == toNumber(y)
String Object x == toPrimitive(y)
其他情況 false

總結(jié)來說:

  • 任意一端為Boolean的掖蛤,先把Boolean轉(zhuǎn)化為Number,再跟另一端比較
  • 一端為Number井厌,一端為String的蚓庭,把String轉(zhuǎn)化為Number
  • 一端為Number,一端為Object的仅仆,先調(diào)用Object的valueof方法器赞,若沒有再調(diào)用tostring方法;再進(jìn)行比較
  • 一端為Number墓拜,另一端為Null/Undefined的港柜,返回false
  • 其它不屬于上述場景,且無法轉(zhuǎn)換為上述場景的撮弧,返回false

轉(zhuǎn)化為number的規(guī)則:

type result
Undefined NaN
Null 0
Boolean true為1潘懊,false為0
Number 輸入即輸出
String "abc" -> NaN,"123"-> 123贿衍,"+1.23 ">"1.23"授舟,"+1.2.1"->NaN
Object 先調(diào)用valueof,若有結(jié)果根據(jù)上面規(guī)則轉(zhuǎn)換贸辈;若無結(jié)果調(diào)用tostring释树,然后根據(jù)上面規(guī)則轉(zhuǎn)換

3. 實(shí)例解析

if()判斷實(shí)例

題目1:如下代碼輸出什么?

if ("hello") {
    console.log("hello")
}

題目2:如下代碼輸出什么?

if ("") {
    console.log('empty')
}

題目3:如下代碼輸出什么?

if (" ") {
    console.log('blank')
}

題目4:如下代碼輸出什么?

if('0.00'){
  console.log('0.00')
}
  • if()判斷括號中為String字符串時(shí),若為空串擎淤,即不包括任意字符的字串奢啥,為false,否則為true嘴拢;
    因此問題1輸出結(jié)果為"hello"桩盲;
    問題2輸出結(jié)果為不輸出;
    問題3輸出結(jié)果為"blank"席吴;
    問題4輸出結(jié)果為"0.00"赌结;

題目5:如下代碼輸出什么?

if ([0]) {
    console.log('array')
}
  • if()判斷括號中為對象時(shí),對象不為空孝冒,判斷為true柬姚;
    因此問題5輸出結(jié)果為"array";

題目6:如下代碼輸出什么?

if (1) {
    console.log('true')
}
if (0) {
    console.log('error')
}
if (0.00) {
    console.log('hehe')
}
  • if()判斷括號中為數(shù)字時(shí)庄涡,非0量承,判斷為true;否則為false
    因此問題6輸出結(jié)果為"true";

==判斷實(shí)例

"" == 0  //題目1
" " == 0  //題目2
"" == true  //題目3
"" == false  //題目4
" " == true  //題目5
  • 兩端數(shù)據(jù)類型不一樣時(shí)撕捍,且兩端為Number和String時(shí)拿穴,將String都轉(zhuǎn)化為Number進(jìn)行比較:
    ""轉(zhuǎn)化為Number是0,因此題目1返回true
    " "轉(zhuǎn)化為Number是0卦洽,因此題目2返回true
  • 有一端為Boolean時(shí)贞言,將Boolean先轉(zhuǎn)化為Number斜棚,再進(jìn)行比較:
    true轉(zhuǎn)化為Number是1阀蒂,false轉(zhuǎn)化為Number是0,比較Number和String
    ""轉(zhuǎn)化為Number是0弟蚀,因此題目3返回false蚤霞,題目4返回true
    " "轉(zhuǎn)化為Number是0,因此題目5返回false
!" " == true  //題目6
!" " == false  //題目7
"hello" == true  //題目8
"hello" == false //題目9
"0" == true  //題目10
"0" == false  //題目11
"00" == false  //題目12
"0.00" == false  //題目13
  • !為非操作义钉,先將要操作都表達(dá)式轉(zhuǎn)化為Boolean昧绣," "不是空串,轉(zhuǎn)化為Boolean后為true捶闸,進(jìn)行非操作后為false夜畴;兩端數(shù)據(jù)類型一致,都為Boolean型删壮,直接比較贪绘,
    因此題目6返回false
    因此題目7返回true
  • 一端是Boolean,一端是String央碟,先將Boolean轉(zhuǎn)化為Number税灌;比較Number和String,將String轉(zhuǎn)化為Number再進(jìn)行比較:
    true轉(zhuǎn)化為Number是1
    false轉(zhuǎn)化為Number是0
    "hello"轉(zhuǎn)化為Number是NaN
    因此題目8返回false
    因此題目9返回false
    "0"亿虽,"00"菱涤,"0.00"轉(zhuǎn)化為Number是0
    因此題目10返回false
    因此題目11返回true
    因此題目12返回true
    因此題目13返回true
undefined == null  //題目14
{} == true  //題目15
[] == true  //題目16
var obj = { 
  a: 0, 
  valueOf: function(){return 1} 
} 
obj == "[object Object]"  //題目17
obj == 1  //題目18
obj == true  //題目19
  • undefined == null ,題目14返回true
  • 一端是Boolean洛勉,一端是其它粘秆,先將Boolean轉(zhuǎn)化為Number再進(jìn)行比較;一端是Number收毫,一端是Object攻走,調(diào)用Object的valueof或tostring方法:
    {}調(diào)用valueof無返回值,調(diào)用tostring返回"[object Object]",比較Number與String牛哺。"[object Object]"轉(zhuǎn)化為數(shù)字是NaN陋气,NaN與1比較返回false,題目15返回false
    []調(diào)用valueof沒有結(jié)果引润,調(diào)用tostring返回"",轉(zhuǎn)化為數(shù)字是0巩趁,題目16返回false
    obj調(diào)用valueof得到1,題目19結(jié)果為true
  • Object和String比較,先Object調(diào)用valueof得到1议慰,比較Number與String蠢古;"[object Object]"轉(zhuǎn)化為Number為NaN,題目17結(jié)果為false
  • Object和Number比較别凹,先Object調(diào)用valueof得到1草讶,比較Number;題目18結(jié)果為true
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末炉菲,一起剝皮案震驚了整個(gè)濱河市堕战,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拍霜,老刑警劉巖嘱丢,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異祠饺,居然都是意外死亡越驻,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進(jìn)店門道偷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缀旁,“玉大人,你說我怎么就攤上這事勺鸦〔⑽。” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵祝旷,是天一觀的道長履澳。 經(jīng)常有香客問我,道長怀跛,這世上最難降的妖魔是什么距贷? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮吻谋,結(jié)果婚禮上忠蝗,老公的妹妹穿的比我還像新娘。我一直安慰自己漓拾,他們只是感情好阁最,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著骇两,像睡著了一般速种。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上低千,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天配阵,我揣著相機(jī)與錄音,去河邊找鬼。 笑死棋傍,一個(gè)胖子當(dāng)著我的面吹牛救拉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播瘫拣,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼亿絮,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了麸拄?” 一聲冷哼從身側(cè)響起派昧,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎感帅,沒想到半個(gè)月后斗锭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡失球,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了帮毁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片实苞。...
    茶點(diǎn)故事閱讀 40,505評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖烈疚,靈堂內(nèi)的尸體忽然破棺而出黔牵,到底是詐尸還是另有隱情,我是刑警寧澤爷肝,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布猾浦,位于F島的核電站,受9級特大地震影響灯抛,放射性物質(zhì)發(fā)生泄漏金赦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一对嚼、第九天 我趴在偏房一處隱蔽的房頂上張望夹抗。 院中可真熱鬧,春花似錦纵竖、人聲如沸漠烧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽已脓。三九已至,卻和暖如春通殃,著一層夾襖步出監(jiān)牢的瞬間度液,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留恨诱,地道東北人媳瞪。 一個(gè)月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像照宝,于是被迫代替她去往敵國和親蛇受。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評論 2 359

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

  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執(zhí)行單位為行(line)厕鹃,也就是一...
    悟名先生閱讀 4,151評論 0 13
  • 前言 最先接觸編程的知識是在大學(xué)里面剂碴,大學(xué)里面學(xué)了一些基礎(chǔ)的知識把将,c語言,java語言忆矛,單片機(jī)的匯編語言等察蹲;大學(xué)畢...
    oceanfive閱讀 3,095評論 0 7
  • 之前就一直想養(yǎng)成寫日記的習(xí)慣,但是結(jié)果... 雖然我沒有什么文采但是我想還是應(yīng)該記錄下些什么吧催训,于是準(zhǔn)備以后...
    Smile_everyday閱讀 157評論 0 0
  • 心靈的簡單猶如雨后彩虹洽议,美麗脫俗,彩虹出現(xiàn)的時(shí)刻漫拭,便是風(fēng)雨洗禮后留下的精彩與絢爛亚兄。它是在歷經(jīng)風(fēng)風(fēng)雨雨后,帶著陽光的...
    心軟是病_c027閱讀 243評論 0 0
  • 在微博上又看到這個(gè)頭像采驻,這是我和好好先生的微信頭像审胚,當(dāng)初求他好久他才肯換,現(xiàn)在我們分手了礼旅,頭像沒換膳叨,他不換是因?yàn)閼?..
    Bonnenuit橙熙熙閱讀 149評論 0 0