一、js中六个值
js中有六个值为false ,分别是 0 、“”、null、undefined、NaN、false,其他(包括{}、[]、infinity)都为true。
可以使用Boolean()函数或是两次取非就能获取对象的布尔值,例如Boolean(undefined)和!!undefined同样能取得布尔值false
二、js比较规则
如果比较的两者中有boolean,会把boolean先转换为对应的number,即0和1
如果比较的双方中有一方为number一方为string,会把string转换为数字
把string直接转换为boolean的时候,空字符串转换为false,除此外的一切字符串为true
1. if ('0') alert("'0' is true");
2. if ('0' == false) alert("'0' is false");
3.
4. 运行结果:两次都会alert
Ⅰ.NaN
NaN与任何值都不相等,包括NaN本身。
Ⅱ.相等操作符
在转换不同的数据类型时,相等和不相等操作符遵循下列基本规则:
1. 如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值——false转换为0,而true转换为1;
2. 如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值;
3. 如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf()方法,用得到的基本类型值按照前面的规则进行比较;
Ⅲ.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。
Ⅳ.‘true’==true;为什么返回false
首先 ,'true' == true 符合规则 1,这样就转化成了对 'true' == 1 进行求值
此时,表达式符合规则 2,把 'true' 转换成数值是使用 Number 函数,按照规则 5 和规则 5.5,Number('true') 的值为 NaN,也就是说现在的问题变成了对 NaN == 1 进行求值。
然后,根据NaN规则, NaN == 1 的值是 false。
最后,捋一遍,'true' == true --> 'true' == 1 --> NaN == 1 --> false
三、!和!!的区别及用法
1. !可将变量转换成boolean类型,null、undefined和空字符串取反都为true
2. !!常常用来做类型判断,在第一步!(变量)之后再做逻辑取反运算
let a;
if(a!=null&&typeof(a)!=undefined&&a!=''){
//a有内容才执行的代码
}
if(!!a){
//a有内容才执行的代码...
}
//上面两种写法实现的功能一样,下面一种明显更简单
四、==和===的区别
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和instanceof用法
1. typeof用以获取一个变量或者表达式的类型,typeof一般只能返回如下几个结果:
number,boolean,string,function(函数),object(NULL,数组,对象),undefined。
注意:我们可以使用typeof来获取一个变量是否存在,如if(typeof a!="undefined"){},而不要去使用if(a)因为如果a不存在(未声明)则会出错。
正因为typeof遇到null,数组,对象时都会返回object类型,所以当我们要判断一个对象是否是数组时,或者判断某个变量是否是某个对象的实例则要选择使用另一个关键语法instanceof
2. 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