前言
首先需要知道的是,js中有6个值为false,分别是: 0, '', null, undefined, NaN 和 false, 其他(包括{}, [], Infinity)为true.
可以使用Boolean()函数或是两次取非就能获得对象的布尔值,例如Boolean(undefined)和!!undefined同样能取得布尔值false,
对于0, '', null, undefined, NaN,{}, [], Infinity求布尔值,分别是false false false false false true true true.
因此我们知道的一点是:对象的布尔值是true,即使是对象{}。
boolean类型的特殊性
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
2. 如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值;
也就是说需要将 'true' 转换成数值之后,再与数字 1 进行比较。把 'true' 转换成数值是使用 Number 函数
Number 类型
Number()函数的转换规则如下。
1. 如果是Boolean值,true和false将分别被转换为1和0。
2. 如果是数字值,只是简单的传入和返回。
3. 如果是null值,返回0。
4. 如果是undefined,返回NaN。
5. 如果是字符串,遵循下列规则:
5.1 如果字符串中只包含数字(包括前面带加号或负号的情况),则将其转换为十进制数值, 即"1"会变成1,"123"会变成123,而"011"会变成11(注意:前导的零被忽略了);
5.2 如果字符串中包含有效的浮点格式,如"1.1",则将其转换为对应的浮点数值(同样,也会忽略前导零);
5.3 如果字符串中包含有效的十六进制格式,例如"0xf",则将其转换为相同大小的十进制整数值;
5.4 如果字符串是空的(不包含任何字符),则将其转换为0;
5.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的"非"返回truevar temp = null;
alert(temp);
结果:null
var temp = null;
alert(!temp);
结果:true
var temp = null;
alert(!!temp);
结果:false
2.对undefined的"非"返回truevartemp;
alert(temp);
结果:undefinedvartemp;
alert(!temp);
结果:true
vartemp;
alert(!!temp);
结果:false
3.对空字符串的"非"返回truevar temp="";
alert(temp);
结果:空var temp="";
alert(!temp);
结果:true
var temp="";
alert(!!temp);
结果:false
4.对非零整型的"非"返回falsevar temp=1;
alert(temp);
结果:1
var temp=1;
alert(!temp);
结果:false
var temp=1;
alert(!!temp);
结果:true
5.对0的"非"返回truevar temp = 0;
alert(temp);
结果:0
var temp = 0;
alert(!temp);
结果:true
var temp = 0;
alert(!!temp);
结果:false
6.对字符串的"非"返回falsevar temp="ab";
alert(temp);
结果:abvar temp="ab";
alert(!temp);
结果:false
var temp="ab";
alert(!!temp);
结果:true
7.对数组的"非"返回falsevar 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;
2. ==:称为等值符,当等号两边的类型相同时,直接比较值是否相等,若不相同,则先转化为类型相同的值,再进行比较;
类型转换规则:
1)如果等号两边是boolean、string、number三者中任意两者进行比较时,优先转换为数字进行比较。
2)如果等号两边出现了null或undefined,null和undefined除了和自己相等,就彼此相等
注意:NaN==NaN //返回false,NaN和所有值包括自己都不相等。
关于 null 和 undefined 有一些有趣的特性:
如果对值为 null 的变量使用 typeof 操作符的话,得到的结果是 object ;
而对 undefined 的值使用 typeof,得到的结果是 undefined 。
如 typeof null === "object" //true; typeof undefined === "undefined" //true null == undefined //true,但是 null !== undefined //true
typeof和instanceof用法:
typeof用以获取一个变量或者表达式的类型,typeof一般只能返回如下几个结果:
number,boolean,string,function(函数),object(NULL,数组,对象),undefined。
如:
alert(typeof (123));//typeof(123) 返回"number"
alert(typeof ("123"));//typeof("123") 返回"string"
我们可以使用typeof来获取一个变量是否存在,如if(typeof a!="undefined"){},而不要去使用if(a)因为如果a不存在(未声明)则会出错,
正因为typeof遇到null,数组,对象时都会返回object类型,所以当我们要判断一个对象是否是数组时
或者判断某个变量是否是某个对象的实例则要选择使用另一个关键语法instanceof
instanceof用于判断一个变量是否某个对象的实例,如var a=new Array(); alert(a instanceof Array); 会返回true,
同时alert(a instanceof Object)也会返回true;这是因为Array是object的子类。
再如:function test(){};var a=new test();alert(a instanceof test)会返回true。
console.log(true instanceof Boolean); 返回false
console.log(new Boolean(true) instanceof Boolean); 返回true