今天面试回来,像往常同样打开手机,看到QQ群上有个加群申请,进群得回答问题:true == '0'
,看到有个申请的答案为false,而后我就自信的点了拒绝。闲着无聊,打开电脑在控制台上输入题目,结果为false,我就很好奇为何是这样呢?明明两边的值都会为true啊,为何会错呢(被拒绝的童鞋不要怪我)。带这个这个疑问我翻了下你不知道的javascriptjavascript
javascript中的值分为两类:java
咱们知道能转换为false的基本类型有,咱们称其为假值:面试
那么,上面的值既然能够转化为false,咱们的true == '0'
两边均可以转化为true,那么为何不相等呢?spa
咱们先来讲下宽松相等“==”和“===”。在以往的理解中,个人理解一直是:“==”表示两个值相等,“===”表死两个值和类型相等。可是书中说,它们的理解应该说是这样:“==容许在相等比较中进行强制类型转化,===不容许”,仍是不太理解,两种理解有什么区别吗?暂时放一放,咱们日后看。。。code
下面摘抄一段树上写的区别:ip
根绝第一种解释,===彷佛比==作的事情更多,由于它还要检查值的类型,第二种解释中==的工做量更大一些,由于若是值的类型相同海须要进行强制类型转化。字符串
若是两个值的类型不一样,咱们就须要考虑有没有强制类型转化的必要,有就用==,不然用===string
接下来咱们来看几种比较来加深理解it
var a = 4;
var b = "4";
a == b //true
a === b //false
复制代码
这个结果你们应该都知道,可是 == 比较时,是将两边的值所有转化为数字呢仍是转化为字符串比较呢?未完待续。。。(皮一下:smile:)class
哈哈,开个玩笑,公布答案:转化为数字。依据就是:
ES5规范11.9.3.4-5这样定义(ToNumber强制转化为数字)
(1)若是Type(x)是数字,Type(y)是字符串,则返回x == ToNumber(y)的结果
(2)若是Type(x)是字符串,Type(y)是数字,则返回ToNumber == y的结果
我以为这一块咱们理解的误区比较多,也是出错最多的一块。
例如:
var a = true;
var b = 4;
a == b //false
复制代码
以往咱们的理解是:数字4是一个真值(与假值对应),会转化为true,从而两边相等。哪里错了呢?咱们直接来看ES标准
ES5规范11.9.3.6-7这样定义(ToNumber强制转化为数字)
(1)若是Type(x)是布尔值,则返回ToNumber(x) == y的结果
(2)若是Type(y)是布尔值,则返回x == ToNumber(y)的结果
原来比较的时候是将布尔值转化为数字,即:
var a = true;
var b = 4;
var c = true;
var d = "12";
a == b ===> 1 == 4 //false
c == d ===> 1 == "12" ===> 1 == 12 //false
复制代码
这样是否是清楚多了,因此咱们判断的时候别用( a == true)这种判断。注意:若是x,y中存在 null或undefiend,则参考第三点
ES5规范11.9.3.2-3这样定义
(1)若是x为null,y为undefined,则返回true
(2)若是x为undefined,y为null,则返回true
在 == 中,null和undefined相等,除此以外不存在这种状况
var a = null;
var b;
a == b //true
a == false //false
b == false //false
a == 0 //false
b == 0 //false
a == "" //false
b == "" //false
复制代码
今天就写到这里,第一次写文章,若有什么不对的地方,还望你们指正