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