我是靠谱客的博主 瘦瘦外套,最近开发中收集的这篇文章主要介绍强制类型转换之(==),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

可能大家平时大多使用(===),尽量避免了(==),但是在进行(>)和(<)的时候也会发生(==)同样的隐式转换,所以这个知识点是必须掌握的。

左值(x)右值(y)隐式处理
NumberStringToNumber(y)
StringNumberToNumber(x)
BooleanothersToNumber(x)
othersBooleanToNumber(y)
Object!ObjectToprimitive(x)
!ObjectObjectToprimitive(y)

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

Toprimitive(Object)

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

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

​ 则抛出异常。

比较特殊的知识点

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

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. 可能还有,我只知道这么多了

掌握以上知识点其实已经完全掌握在”==“的状况下的隐式转换了。

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

​ 首先,要纠正一下思维,(==)指可以进行强制类型转换的等于比较,隐式转换只是在双方属于不同类型的时候才会触发,遇到相同类型会直接比较。并且隐式转换具有阶段性,一会我们马上就会遇到。

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

[] == 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

最后

以上就是瘦瘦外套为你收集整理的强制类型转换之(==)的全部内容,希望文章能够帮你解决强制类型转换之(==)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部