js运算符之有猫病的if判断和==判断

初学js时,发现if()中判断的结果和==的判断结果竟然不太一样诶,真的是非常地有猫病了。下面根据js的6中数据类型,对两者进行对比说明!

1. if()的判断

括号里的数据强制转化成Boolean来判断

数据类型 结果
Undefined false
Null false
Boolean 输入即输出
Number +0, −0, NaN为false;其余为true
String ""为false( length 是0);其余为true
Object object为null或undefined时,为false;否则为true.

2. == 判断

2.1 对于左右两端数据类型一致的,==操作与===操作是一致的。

需要注意的是:

  • NaN == NaN 返回false
  • Undefined == Undefined 返回true
  • Null == Null 返回true
  • == 两端为非空对象时,两个对象内存地址一致时返回true,否则返回false

2.2 对于左右两端数据类型不一致的,需要对数据进行转化。

转化规则如下:

一端(x) 另一端(y) 结果
Null Undefined true
Number String x == toNumber(y)
Boolean (any) toNumber(x) == y
Number Object x == toNumber(y)
String Object x == toPrimitive(y)
其他情况 false

总结来说:

  • 任意一端为Boolean的,先把Boolean转化为Number,再跟另一端比较
  • 一端为Number,一端为String的,把String转化为Number
  • 一端为Number,一端为Object的,先调用Object的valueof方法,若没有再调用tostring方法;再进行比较
  • 一端为Number,另一端为Null/Undefined的,返回false
  • 其它不属于上述场景,且无法转换为上述场景的,返回false

转化为number的规则:

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 先调用valueof,若有结果根据上面规则转换;若无结果调用tostring,然后根据上面规则转换

3. 实例解析

if()判断实例

题目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字符串时,若为空串,即不包括任意字符的字串,为false,否则为true;
    因此问题1输出结果为"hello";
    问题2输出结果为不输出;
    问题3输出结果为"blank";
    问题4输出结果为"0.00";

题目5:如下代码输出什么?

if ([0]) {
    console.log('array')
}
  • if()判断括号中为对象时,对象不为空,判断为true;
    因此问题5输出结果为"array";

题目6:如下代码输出什么?

if (1) {
    console.log('true')
}
if (0) {
    console.log('error')
}
if (0.00) {
    console.log('hehe')
}
  • if()判断括号中为数字时,非0,判断为true;否则为false
    因此问题6输出结果为"true";

==判断实例

"" == 0  //题目1
" " == 0  //题目2
"" == true  //题目3
"" == false  //题目4
" " == true  //题目5
  • 两端数据类型不一样时,且两端为Number和String时,将String都转化为Number进行比较:
    ""转化为Number是0,因此题目1返回true
    " "转化为Number是0,因此题目2返回true
  • 有一端为Boolean时,将Boolean先转化为Number,再进行比较:
    true转化为Number是1,false转化为Number是0,比较Number和String
    ""转化为Number是0,因此题目3返回false,题目4返回true
    " "转化为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
  • !为非操作,先将要操作都表达式转化为Boolean," "不是空串,转化为Boolean后为true,进行非操作后为false;两端数据类型一致,都为Boolean型,直接比较,
    因此题目6返回false
    因此题目7返回true
  • 一端是Boolean,一端是String,先将Boolean转化为Number;比较Number和String,将String转化为Number再进行比较:
    true转化为Number是1
    false转化为Number是0
    "hello"转化为Number是NaN
    因此题目8返回false
    因此题目9返回false
    "0","00","0.00"转化为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转化为Number再进行比较;一端是Number,一端是Object,调用Object的valueof或tostring方法:
    {}调用valueof无返回值,调用tostring返回"[object Object]",比较Number与String。"[object Object]"转化为数字是NaN,NaN与1比较返回false,题目15返回false
    []调用valueof没有结果,调用tostring返回"",转化为数字是0,题目16返回false
    obj调用valueof得到1,题目19结果为true
  • Object和String比较,先Object调用valueof得到1,比较Number与String;"[object Object]"转化为Number为NaN,题目17结果为false
  • Object和Number比较,先Object调用valueof得到1,比较Number;题目18结果为true
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容

  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,135评论 0 13
  • 前言 最先接触编程的知识是在大学里面,大学里面学了一些基础的知识,c语言,java语言,单片机的汇编语言等;大学毕...
    oceanfive阅读 3,049评论 0 7
  • 之前就一直想养成写日记的习惯,但是结果... 虽然我没有什么文采但是我想还是应该记录下些什么吧,于是准备以后...
    Smile_everyday阅读 153评论 0 0
  • 心灵的简单犹如雨后彩虹,美丽脱俗,彩虹出现的时刻,便是风雨洗礼后留下的精彩与绚烂。它是在历经风风雨雨后,带着阳光的...
    心软是病_c027阅读 241评论 0 0
  • 在微博上又看到这个头像,这是我和好好先生的微信头像,当初求他好久他才肯换,现在我们分手了,头像没换,他不换是因为懒...
    Bonnenuit橙熙熙阅读 149评论 0 0