【JavaScript】bool值转换与比较
前言
首先需要知道的是,js中有6个值为false,分别是: 0, '', null, undefined, NaN 和 false, 其他(包括{}, [], Infinity)为true。可以使用Boolean()函数或是两次取非就能获得对象的布尔值,例如Boolean(undefined)和!!undefined同样能取得布尔值false。因此我们知道的一点是:对象的布尔值是true,即使是对象{}。
boolean类型的特殊性
类型 | 真假值 |
Null | 总是为假(false) |
Undefined | 总是为假(false) |
Boolean | 保持真假值不变 |
Number | +0,-0或是NaN的时候为假,其他值为真 |
String | 空字符串的时候为假,其他值为真 |
Object | 总是为真(true) |
JS比较规则:
- 如果比较的两者中有bool,会把 bool 先转换为对应的number,即 0 和 1
- 如果比较的双方中有一方为 number 一方为 string,会把string转换为数字
- 把string直接转换为bool的时候,空字符串''转换为 false,除此外的一切字符串转换为 true
示例:
if ('0') alert("'0' is true"); if ('0' == false) alert("'0' is false"); //运行结果:两次都会alter
示例:‘true’== true;为什么返回false
相等操作符
在转换不同的数据类型时,相等和不相等操作符遵循下列基本规则:
- 如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值:false转换为0,而true转换为1;
- 如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值;
- 如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf()方法,用得到的基本类型值按照前面的规则进行比较;
首先 'true' == true 符合规则 1,这样就转化成了对 'true' == 1 进行求值,此时表达式符合规则 2,也就是说需要将 'true' 转换成数值之后,再与数字 1 进行比较。把 'true' 转换成数值是使用 Number 函数
Number 类型
Number()函数的转换规则如下:
- 如果是Boolean值,true和false将分别被转换为1和0;
- 如果是数字值,只是简单的传入和返回;
- 如果是null值,返回0;
- 如果是undefined,返回NaN;
- 如果是字符串,遵循下列规则:
- 如果字符串中只包含数字(包括前面带加号或负号的情况),则将其转换为十进制数值, 即"1"会变成1,"123"会变成123,而"011"会变成11(注意:前导的零被忽略了);
- 如果字符串中包含有效的浮点格式,如"1.1",则将其转换为对应的浮点数值(同样,也会忽略前导零);
- 如果字符串中包含有效的十六进制格式,例如"0xf",则将其转换为相同大小的十进制整数值;
- 如果字符串是空的(不包含任何字符),则将其转换为0;
- 如果字符串中包含除上述格式之外的字符,则将其转换为NaN;
按照规则 5 和规则 5.5,Number('true') 的值为 NaN,也就是说现在的问题变成了对 NaN == 1 进行求值。NaN与任何值都不相等,包括NaN本身。也就是说 NaN == 1 的值是 false。最后捋一遍,'true' == true --> 'true' == 1 --> NaN == 1 --> false
!和!!的区别及用法
1. !可将变量转换成boolean类型,null、undefined和空字符串取反都为false,其余都为true
!null=true
!undefined=true
!''=true
!100=false
!'abc'=false
2. !!常常用来做类型判断,在第一步!(变量)之后再做逻辑取反运算
let a;
if(a!=null&&typeof(a)!=undefined&&a!=''){
//a有内容才执行的代码
}
if(!!a){
//a有内容才执行的代码...
}
上面两种写法实现的功能一样,下面一种明显更简单
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1.对null的"非"返回true var temp = null; alert(temp); 结果:null var temp = null; alert(!temp); 结果:true var temp = null; alert(!!temp); 结果:false 2.对undefined的"非"返回true var temp; alert(temp); 结果:undefined var temp; alert(!temp); 结果:true var temp; alert(!!temp); 结果:false 3.对空字符串的"非"返回true var temp=""; alert(temp); 结果:空 var temp=""; alert(!temp); 结果:true var temp=""; alert(!!temp); 结果:false 4.对非零整型的"非"返回false var temp=1; alert(temp); 结果:1 var temp=1; alert(!temp); 结果:false var temp=1; alert(!!temp); 结果:true 5.对0的"非"返回true var temp = 0; alert(temp); 结果:0 var temp = 0; alert(!temp); 结果:true var temp = 0; alert(!!temp); 结果:false 6.对字符串的"非"返回false var temp="ab"; alert(temp); 结果:ab var temp="ab"; alert(!temp); 结果:false var temp="ab"; alert(!!temp); 结果:true 7.对数组的"非"返回false var temp=[1,2]; alert(temp); 结果:1,2 var temp=[1,2]; alert(!temp); 结果:false var temp=[1,2]; alert(!!temp); 结果:true
==和===的区别
- ===:称为等同符,当两边值的类型相同时,直接比较值,若类型不相同,直接返回false;(switch 语句会使用恒等计算符(===)进行比较)
- ==:称为等值符,当等号两边的类型相同时,直接比较值是否相等,若不相同,则先转化为类型相同的值,再进行比较;
类型转换规则:
- 如果等号两边是boolean、string、number三者中任意两者进行比较时,优先转换为数字进行比较;
- 如果等号两边出现了null或undefined,null和undefined除了和自己相等,就彼此相等;
注意:
- NaN==NaN //返回false,NaN和所有值包括自己都不相等;
- 如果对值为 null 的变量使用 typeof 操作符的话,得到的结果是 object ;
- 而对 undefined 的值使用 typeof,得到的结果是 undefined ;
- 如 typeof null === "object" //true; typeof undefined === "undefined" //true null == undefined //true,但是 null !== undefined //true;