看到这么一个题目,问什么情况下控制台会输出hello
if (input) {
console.log('hello')
}
// input的选项有以下:'', null, NaN, 0, [], {}, Boolean(false), false, true, undefined, 'false'
结论:当input为[], {}, true, 'false’时控制台会输出hello,其余均不会。
当input是[]时,控制台打印了hello说明[]是true的,但是问题又来了
let arr = []
console.log(arr == true) // false
console.log(arr == false) // true
我们直接将空数组与布尔值false进行比较时,控制台打印的却是false。
我们将数组转换为Boolean,再比较
let arr = []
let booleanArr = new Boolean(arr)
console.log(booleanArr == true) // true
console.log(booleanArr == false) // false
由此得知在if条件中的比较会先将input转换为Boolean然后再进行比较。
那么我们回过头来看在数组arr与布尔值进行非严格相等(==)比较时到底发生了什么?
结论:任意值与布尔值进行比较时会将两边的值转换为Number。
console.log(Number([])) // 0
console.log(Number(true)) // 1
console.log(Number(false)) // 0
所以当数组[]与布尔值true直接进行非严格相等比较的时候,返回的是false。
js中非严格相等(==)的比较总结
ECMAScript中相等操作符由两个等于号(==)表示,如果两个操作数相等,则返回true,这种操作符都会先转换操作数(通常称为强制转型),然后再比较它们的相等性,在转换不同的数据类型时,对于相等和不相等操作符:在JS高程中一书中给出如下的基本转换规则:
- 如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值——false转换为0,而true转换为1;
- 如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值
- 如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf()方法,用得到的基本类型值按照前面的规则进行比较
这两个操作符在进行比较时则要遵循下列规则:
- null 和undefined 是相等的
- 要比较相等性之前,不能将null 和 undefined 转换成其他任何值
- 如果有一个操作数是NaN,则相等操作符返回 false ,而不相等操作符返回 true。重要提示:即使两个操作数都是NaN,相等操作符也返回 false了;因为按照规则, NaN 不等于 NaN
- 如果两个操作数都是对象,则比较它们是不是同一个对象,如果两个操作数都指向同一个对象,则相等操作符返回 true;否则, 返回false
js非严格相等(==)比较表
附文档链接:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Equality_comparisons_and_sameness#非严格相等