美文网首页饥人谷技术博客
js运算符之有猫病的if判断和==判断

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

作者: Coding破耳 | 来源:发表于2018-03-25 00:12 被阅读6次

初学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

相关文章

网友评论

    本文标题:js运算符之有猫病的if判断和==判断

    本文链接:https://www.haomeiwen.com/subject/ynuccftx.html