if(condition) VS a == b
你真的了解判断语句吗?
判断语句是程序设计中最基本的语句,我们无时无刻不在与其产生交集,或许在看到这篇文章的前一秒,你正写完一个条件判断以满足功能需求。但是,有时候碰到一些奇怪的面试题,我们或许会怀疑“我真的了解判断语句吗?”。
牛刀小试
if("hello") {
console.log("hello");
}
if("") {
console.log("empty);
}
if(" ") {
console.log("blank");
}
if("[0]") {
console.log("array");
}
if("0.00") {
console.log("0.00")
}
上面的是不是so easy,可能都觉得有些无聊了QAQ,嘿,先别走啊,再看看下面的。
"" == 0
" " == 0
"" == true
" " == true
!" " == true
"hello" == true
"0" == true
undefined == null
{} == true
[] == true
var obj = {
a: 0,
valueOf: function() {return 1}
}
obj == "[object Object]"
obj == 1
obj == true
嗯~,好像需要思考了,,,接下来,我们来了解一些判断的内部比较原理。
言归正传
对于if(condition)
对于if括号中的表达式(这里指单个变量),会被强制转化为Boolean类型,转化规则如下:
类型 | 结果 |
---|---|
undefined | false |
null | false |
Boolean | 直接判断 |
Number | +0、-0、NaN为false,其他为true |
String | 空字符串为false,其他都为true |
Object | true |
对于x == y类型判断
结果映射为下:
x | y | 结果 |
---|---|---|
null | undefined | true |
Number | String | x == toNumber(y) |
Boolean | (any) | toNumber(x) == y |
Object | String or Number | toPrimitive(x) == y |
上表中的toNumber表示强制转化为Number,转化规则如下:
Type | Result |
---|---|
undefined | NaN |
null | 0 |
Boolean | true -> 1,false -> 0 |
String | "abc" -> NaN,"123" -> 123 |