关于if(xx)和|关于if(xx)和 a==b的判断解析

if(XXX)的判断 if (XXX) {}
首先括号中的XXX会被强制转换为布尔类型,那究竟是true 还是 false 呢?有如下原理可以参考:

类型 结果
Undefined false
Null false
Boolean 直接判断
Number +0, ?0, 或者 NaN 为 false, 其他为 true
String 空字符串为 false,其他都为 true
Object true
我们先来看看如下几题:
// 题目1:如下代码输出什么? if ("hello") { console.log("hello") }// 题目2:如下代码输出什么? if ("") { console.log('empty') }// 题目3:如下代码输出什么? if (" ") { console.log('blank') } // 题目4:如下代码输出什么? if ([0]) { console.log('array') }if('0.00'){ console.log('0.00') }

其中除了第二题的空字符串被转换为false, 其余全被是true。
==的判断 【关于if(xx)和|关于if(xx)和 a==b的判断解析】== 先类型转换,再判断相等
对不同类型的值有如下转换方法:
  • 原始数据类型会转换成数值类型再做比较,toNumber( )
  • 复杂类型调用 .valueOf 和 .toString方法转换为原始类型在做比较
  • undeifined和null与其他类型值比较时都为 false, 它们相互比较时为 true
以下的表格能更清晰直观的表示:
x y 结果
null undefined true
Number String x == toNumber(y)
Boolean (any) toNumber(x) == y
Object String or Number toPrimitive(x) == y
otherwise otherwise false
  • 其中 toNumber 方法对不同类型的值有如下结果
type Result
Undefined NaN
Null 0
Boolean ture -> 1, false -> 0
String “abc” -> NaN, “123” -> 123
  • toPrimitive: 对于 Object 类型,先尝试调用 .valueOf 方法获取结果。 如果没定义,再尝试调用 .toString方法获取结果。

    推荐阅读