前言
首先需要知道的是,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
相等操作符
首先 'true' == true 符合规则 1,这样就转化成了对 'true' == 1 进行求值
此时表达式符合规则 2
也就是说需要将 'true' 转换成数值之后,再与数字 1 进行比较。把 'true' 转换成数值是使用 Number 函数
Number 类型
按照规则 5 和规则 5.5,Number('true') 的值为 NaN,也就是说现在的问题变成了对 NaN == 1 进行求值。
还是在这一节中,提到了
也就是说 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
==和===的区别
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