你真的懂 == 比较吗

今天面试回来,像往常同样打开手机,看到QQ群上有个加群申请,进群得回答问题:true == '0',看到有个申请的答案为false,而后我就自信的点了拒绝。闲着无聊,打开电脑在控制台上输入题目,结果为false,我就很好奇为何是这样呢?明明两边的值都会为true啊,为何会错呢(被拒绝的童鞋不要怪我)。带这个这个疑问我翻了下你不知道的javascriptjavascript

javascript中的值分为两类:java

  1. 能够被强制转化为false的值
  2. 其余(能够被强制转化为true的值)

咱们知道能转换为false的基本类型有,咱们称其为假值:面试

  • undefined
  • null
  • ""
  • 0和NaN
  • false

那么,上面的值既然能够转化为false,咱们的true == '0'两边均可以转化为true,那么为何不相等呢?spa

咱们先来讲下宽松相等“==”和“===”。在以往的理解中,个人理解一直是:“==”表示两个值相等,“===”表死两个值和类型相等。可是书中说,它们的理解应该说是这样:“==容许在相等比较中进行强制类型转化,===不容许”,仍是不太理解,两种理解有什么区别吗?暂时放一放,咱们日后看。。。code

下面摘抄一段树上写的区别:ip

根绝第一种解释,===彷佛比==作的事情更多,由于它还要检查值的类型,第二种解释中==的工做量更大一些,由于若是值的类型相同海须要进行强制类型转化。字符串

若是两个值的类型不一样,咱们就须要考虑有没有强制类型转化的必要,有就用==,不然用===string

接下来咱们来看几种比较来加深理解it

  1. 字符串和数字的比较
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的结果

  1. 其余类型与布尔值比较

我以为这一块咱们理解的误区比较多,也是出错最多的一块。

例如:

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,则参考第三点

  1. null和undefined之间的比较

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
复制代码

今天就写到这里,第一次写文章,若有什么不对的地方,还望你们指正

相关文章
相关标签/搜索