【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

相等操作符

在转换不同的数据类型时,相等和不相等操作符遵循下列基本规则:

  1. 如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值:false转换为0,而true转换为1;
  2. 如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值;
  3. 如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf()方法,用得到的基本类型值按照前面的规则进行比较;

首先 'true' == true 符合规则 1,这样就转化成了对 'true' == 1 进行求值,此时表达式符合规则 2,也就是说需要将 'true' 转换成数值之后,再与数字 1 进行比较。把 'true' 转换成数值是使用 Number 函数

Number 类型

Number()函数的转换规则如下:

  1. 如果是Boolean值,true和false将分别被转换为1和0;
  2. 如果是数字值,只是简单的传入和返回;
  3. 如果是null值,返回0;
  4. 如果是undefined,返回NaN;
  5. 如果是字符串,遵循下列规则: 
    1. 如果字符串中只包含数字(包括前面带加号或负号的情况),则将其转换为十进制数值, 即"1"会变成1,"123"会变成123,而"011"会变成11(注意:前导的零被忽略了);
    2. 如果字符串中包含有效的浮点格式,如"1.1",则将其转换为对应的浮点数值(同样,也会忽略前导零);
    3. 如果字符串中包含有效的十六进制格式,例如"0xf",则将其转换为相同大小的十进制整数值;
    4. 如果字符串是空的(不包含任何字符),则将其转换为0;
    5. 如果字符串中包含除上述格式之外的字符,则将其转换为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有内容才执行的代码...  
}

上面两种写法实现的功能一样,下面一种明显更简单

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
View Code

==和===的区别

  1. ===:称为等同符,当两边值的类型相同时,直接比较值,若类型不相同,直接返回false;(switch 语句会使用恒等计算符(===)进行比较)
  2. ==:称为等值符,当等号两边的类型相同时,直接比较值是否相等,若不相同,则先转化为类型相同的值,再进行比较;

类型转换规则:

  1. 如果等号两边是boolean、string、number三者中任意两者进行比较时,优先转换为数字进行比较;
  2. 如果等号两边出现了null或undefined,null和undefined除了和自己相等,就彼此相等;

注意:

  1. NaN==NaN  //返回false,NaN和所有值包括自己都不相等;
  2. 如果对值为 null 的变量使用 typeof 操作符的话,得到的结果是 object ;
  3. 而对 undefined 的值使用 typeof,得到的结果是 undefined ;
  4. 如 typeof null === "object" //true; typeof undefined === "undefined" //true null == undefined //true,但是 null !== undefined //true;
posted @ 2019-08-07 10:30  智者见智  阅读(5003)  评论(0编辑  收藏  举报