一.以下数据类型转布尔值,以下均返回true:
1. 非空字符串
2. 非零数值
3. 数组
4. 对象
5. 函数
二.判断方法:
1. 前提条件:
1) 相等操作符,不同数据类型会根据一定规则转换为同一数据类型再比较
注意: (这里指的数据类型也可能需要转换,总之最后比较时一定是同一数据类型)进行比较
2. 数组与数组比较,比较的是其引用:
a数组==b数组,不管左边和右边的数组是否完全一样,都是false
所以[同理[] == []是false, {} == {}是false
3. 不同类型比较,遇数值则转数值,布尔值自身转数值
1) a为非数字变量:
a==布尔值 =>先将右边的布尔值转化为数字, true是1,false是0;左边a需要转换为数字进行比较; 布尔值==a同理
2) a为非数字变量:
a==数字=>将左边a转化为原始值再转化为数字比较; 数字==a同理
总结:
数组、对象和函数在与其他基本数据类型进行比较时都会先转换为字符串,然后再转换为相应的数据类型
4.非空非零引用型,转为布尔均为真
注意: [], {}转化为布尔值也是true
5. null、undefined和NaN
这三个是个特例,他们比较特殊:
1) null==undefined为true;
2) null和undefined不会进行数据转换;
3) NaN不与任何值相等,甚至包括它自己!
三.实例及分析:
1. []==![]的比较结果是什么?(答案:true)
解析过程:
1) 将右侧[]转换为布尔值后再取反,[]转换布尔值是true,![]相当于true取反为false
2) 根据二判断方法第3条:“比较前需要布尔值转数值”规则,右边的false转换为数字0
3) 根据“比较前数组遇数值先转字符串后转数值”规则,相当于左边[]先使用toString()转换为字符串'',''再转换为数字就是0, 和右边的0比较自然相等
2. [] == []的比较结果是什么?(答案是false)
解析过程:
根据二判断方法第2条:"数组与数组比较,比较的是其引用", 如果属于不同的引用, 结果是false
注意: 不管==左右两边是什么类型的数组进行比较, 引用若不同, 答案都是false
3. 练习题:
let val = [] == ![]
console.log(val) // true
console.log([+val, [] + 1] == [1, 1] + []) // true
console.log([+val, [] + 1] == [1, '1']) // false
解析过程:
/**
* 1. 先看右边, ![]转换为布尔值false
* 2. 一边是布尔值的时候,一边就要转换为数字=>左边[]转换为0
* 3. 右边 =>false转换为数字=>也就是0
* 4. 左边0 == 右边0, 自然结果是true
*/
let val = [] == ![]
console.log(val) // true
/**
* 1. 从上面可知val是true, true遇上+号隐式转换为数字是1
* 2. []+1 => ''+1 => 字符串'1'
* 3. 所以左边是[1, '1']
* 4. 右边: [1,1]+[] => [1,1]+'' =>相当于使用了arr.toString()[效果相当于arr.join(',')] => 得到字符串'1,1'
* 5. 左边也使用使用arr.join(',') => 得到字符串'1,1'
* 6. 左边'1,1' == 右边'1,1', 结果为true
*/
console.log([+val, [] + 1] == [1, 1] + []) // true
// 根据二判断方法第2条:"数组与数组比较,比较的是其引用", 答案都是false
console.log([+val, [] + 1] == [1, '1']) // false