概述
可能大家平时大多使用(===),尽量避免了(==),但是在进行(>)和(<)的时候也会发生(==)同样的隐式转换,所以这个知识点是必须掌握的。
左值(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表示其它基础类型
Toprimitive(Object)
先返回valueOf()的值,若返回的不是基础类型的值,
则返回toString()的值,若返回的不是基础类型的值,
则抛出异常。
比较特殊的知识点
null和undefined单独出现与其他值进行比较不进行转换。
isNaN(Number(undefined))
//true
Number(null)===0
//true
Number("[空值或空值的组合]")===0
//true
复制代码
什么是空值?
- null
- (啥都没有)
- (Space空格)
- (空格的转义)
- (Tab缩进)
- r
- n
- f
- t
- 可能还有,我只知道这么多了
掌握以上知识点其实已经完全掌握在”==“的状况下的隐式转换了。
下面让我们来分析一下如何判断隐式转换
首先,要纠正一下思维,(==)指可以进行强制类型转换的等于比较,隐式转换只是在双方属于不同类型的时候才会触发,遇到相同类型会直接比较。并且隐式转换具有阶段性,一会我们马上就会遇到。
下面开始分析,看一下下面的例子
[] == 0; //true
复制代码
看这个例子,它符合左值为”Object“,右值为”Number“的情况,所以进行Toprimitive([]),变为
"" == 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
复制代码
转载于:https://juejin.im/post/5bf4dfe2518825490e0f799c
最后
以上就是瘦瘦外套为你收集整理的强制类型转换之(==)的全部内容,希望文章能够帮你解决强制类型转换之(==)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复