强制类型转换之(==)

可能你们平时大多使用(===),尽可能避免了(==),可是在进行(>)和(<)的时候也会发生(==)一样的隐式转换,因此这个知识点是必须掌握的。javascript

左值(x) 右值(y) 隐式处理
Number String ToNumber(y)
String Number ToNumber(x)
Boolean others ToNumber(x)
others Boolean ToNumber(y)
Object !Object Toprimitive(x)
!Object Object Toprimitive(y)

注意:此处的others表示其它基础类型java

Toprimitive(Object)

​ 先返回valueOf()的值,若返回的不是基础类型的值,bash

​ 则返回toString()的值,若返回的不是基础类型的值,ui

​ 则抛出异常。spa

比较特殊的知识点

null和undefined单独出现与其余值进行比较不进行转换。code

isNaN(Number(undefined))  //true
Number(null)===0  //true
Number("[空值或空值的组合]")===0  //true
复制代码
什么是空值?
  1. null
  2. (啥都没有)
  3. (Space空格)
  4. (空格的转义)
  5. (Tab缩进)
  6. \r
  7. \n
  8. \f
  9. \t
  10. 可能还有,我只知道这么多了

掌握以上知识点其实已经彻底掌握在”==“的情况下的隐式转换了。ip

下面让咱们来分析一下如何判断隐式转换

​ 首先,要纠正一下思惟,(==)指能够进行强制类型转换的等于比较,隐式转换只是在双方属于不一样类型的时候才会触发,遇到相同类型会直接比较。而且隐式转换具备阶段性,一会咱们立刻就会遇到。string

​ 下面开始分析,看一下下面的例子it

[] == 0; //true
复制代码

​ 看这个例子,它符合左值为”Object“,右值为”Number“的状况,因此进行Toprimitive([]),变为console

"" == 0;
复制代码

​ 此时咱们把这个结果叫作隐式转换的第一阶段结果,由于(==)两边的类型仍是不相同,因此要再次进行隐式转换,如今它符合左值为“String”,右值为“Number的状况”,因此进行ToNumber(“”),根据上面所说的特殊知识点,变为

0 == 0;  //true
复制代码

​ 此时为第二阶段的结果,类型相同,进行比较。

​ 下面你能够试着本身分析一下下面的例子

[null] == 0;  //true
复制代码

​ 不要着急,让咱们再来一个例子

[] == [null];  //false
复制代码

​ 啊???怎么回事,结果跟咱们想像的好像不同?既然([]==0)和([null]==0),难道根据这两个结果不该该是推导出([]==[null])嘛?缘由在于你没有遵照咱们分析的隐式转换原则,只有不一样类型才会进行隐式转换,可是如今咱们比较的两个值是相同的类型!

以上内容一样适用于(<)和(>)

​ 可是要注意(<=)和(>=),他在引擎中会被处理成不大于和不小于,如:

a<=b    --->    !(a>b)
复制代码

​ 为何要说这点?试着输出下面的例子你就明白了

var a= {b:1};
var b= {b:2};

console.log(a>b);  //false
console.log(a==b);  //false
console.log(a>=b);  //true
复制代码
相关文章
相关标签/搜索