问题:if(xxx){console.log(1)}else{console.log(2)},输出为2的类型有哪些?
解答:
当我们用 if 做判断的时候,if 后面的括号里表达式的值必须是布尔型,比如
if(a > 1){
console.log('a>1')
}
if(b === 3 || c > 4){
console.log('hello')
}如果括号里是其他写法,则会把运算后的值强制转换为布尔型,如
if(1){ // Boolean(1) -> true
console.log('hello')
}
if( a = 3 ){ // a = 3 的结果是3, Boolean(3) -> true
console.log('hello')
}
if( a = 0 ){ // a = 0 的结果是3, Boolean(0) -> false
console.log('hello')
}else{
console.log('world') // 输出world
}
强制转换结果为 falsy的值基础类型有6个:
- false
- 0
- '', 注意这里是空字符串,不是 ' '
- null
- undefined
- NaN
看下面几个例子:
var a;
if(a){console.log(1)}else{console.log(2)} //输出2
if(""){console.log(1)}else{console.log(2)} //输出2
if(a=null){console.log(1)}else{console.log(2)} //输出2, a=null的结果是null
if(1/'a'){console.log(1)}else{console.log(2)} //输出2, 1/'a'为NaN
if(parseInt('123hello')){ //parseInt('123hello') -> '123' -> true
console.log(1)
}else{
console.log(2)
}
if(Number('123hello')){ //Number('123hello') -> NaN -> false
console.log(1)
}else{
console.log(2)
}
从上面的例子可以看出直接做判断代码的可读性很差,一不留神就埋下了难以察觉的祸根。
所以我们建议用 === 做精准判断,比如:
if(a === ''){console.log(1)} else{console.log(2)}但 NaN的判断除外
if( 1/'a' === NaN) {console.log(1)} else{console.log(2)} //输出2
if(isNaN(1/'a')) {console.log(1)} else{console.log(2)} //输出1还有一点需要注意,对于 函数、数组、对象、正则... 这些引用类型,Boolean 强制转换后结果都是 true, 如:
if( {} ){console.log(1)} else{console.log(2)} // 输出1
if( [] ){console.log(1)} else{console.log(2)} // 输出1
if(document.body){console.log(1)} else{console.log(2)} //输出1但有一个对象例外: document.all, 参考前面每日一题 「每日一题」为什么 document.all 有时像一个对象,有时又不像一个对象 - 前端学习指南 - 知乎专栏
if( document.all ) {console.log(1)} else{console.log(2)} // 输出2完
欢迎进群与我探讨技术,戳此扫码加微信进程序员分享交流群。
本文作者饥人谷-若愚,未经同意禁止转载,转载请联系本人并加上版权声明和群链接。