前端学习笔记

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

2019-03-24  本文已影响4人  饥人谷_island

if(xx)

if后的括号里的表达式会被强制转换为布尔类型

数据类型 转换结果
Undefined false
Null false
Boolean 直接判断
Number +0, −0, 或者 NaN 为 false, 其他为 true
String 空字符串为 false,其他都为 true
Object true

a = 1
if(a){
console.log('true')
} // true
a = -1
if(a){
console.log('true')
} //false
a = NaN
if(a){
console.log('true')
} //false

if('hello'){
console.log('true')
} // true
if(' '){
console.log('true')
} // true
if(''){
console.log('true')
} // false
if('0.00'){
console.log('true')
}

if([1,2]){
console.log('true')
} // true
function f(){
var b = 2;
return b;
}
if(f()){
console.log('true')
} //true

if(undefined){
console.log('true')
} //false

if(null){
console.log('true')
} //false

a == b 的判断

a b 结果
null underfined 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方法获取结果

"" == 0 //true
" " == 0 //true
"hello" == 0 //false
"hello" == 1 //false
"2" == 2 //true

"" == true //false
"" == false //true
" " == true //false
"hello" == true //false
1 == true //true

0 == false //true
undefined == false //false
undefined == true //false
null == false //false
null == true //false

object会试图使用valueOf和toString转换后比较

var obj = {
a: 0,
valueOf: function(){return 1}
}
obj == 1 //true
[] == 0 //true
[2] == 2 //true

一般来说:

做相等运算时,一般倾向于将不同的数据类型都转化为数值,或是转化为相同的数据类型.

  1. 如果一个是null,一个是undefined,那么相等
  2. 如果一个是数字,一个是字符串,先将字符串转为数字,然后比较
  3. 如果一个值是true/false则将其转为1/0比较
  4. 如果一个值是对象,一个是数字或字符串,则尝试使用valueOf和toString转换后比较
  5. 其它就不相等了
上一篇下一篇

猜你喜欢

热点阅读