龙空技术网

Javascript中双等号(==)隐性转换机制,你真的知道吗?

前端周老师 683

前言:

如今看官们对“js一个等号和两个等号的区别”大致比较关切,朋友们都想要分析一些“js一个等号和两个等号的区别”的相关知识。那么小编同时在网上搜集了一些对于“js一个等号和两个等号的区别””的相关知识,希望你们能喜欢,咱们一起来学习一下吧!

前言

在Javascript中判断相等有双等号(==)和三等号(===)两种,相信大家都知道三等号(===)是严格相等,而双等号(==)在判断相等的过程中会进行隐性转化。比如'1'==1就会返回true。

但是整个Javascript中使用双等号(==)判断相等的隐性转换机制,你都有全部了解吗?如果没有的话就刚好跟着我来一起看看吧。

Javascript

步骤1-是否有NaN

首先判断双等号两边是否有NaN,如果有的话,则一律返回false。

步骤1

步骤2-是否有boolean值

第二步,判断是否有布尔类型值,如果有的话则将true转化为1,false转化为0。

此时如果等号两边都是简单类型,可以直接进行判断。

步骤2

如果等号两边有对象或者数组类型,则需要先转化成简单类型,转换的过程看第三步。

步骤3-有一方是字符串

如果等号一边是字符串,另一边则要分以下几种情况:

同样是字符串,则直接进行字符串值的比较

是数字,则需要将字符串转化为数字,然后进行比较

有布尔类型,则要将布尔类型转化为0或则1,然后进行比较

对象或者数组类型,则需要调用toString()或者valueOf()方法转化成简单类型,然后进行比较

上述的前三条都很好理解,重点是第四条的toString()和valueOf()转化,这个我们在后面会具体讲到。

步骤4-null和undefined

遇到null或者undefined,则不会进行类型转换,它们相互的比较都返回true。

null和undefined

重点-toString()和valueOf()

很多人看到这两个方法的第一感觉就是,toString()方法将一个对象转化为字符串,valueOf方法将一个对象转化为数值。

这种想法很片面,我们通过以下两个例子来看看。

对象

定义一个obj对象,调用它的toString方法,返回值是[object Object],发现并未像我们想象的一样返回值其内容的字符串表示。

数组

定义一个数组arr,调用它的valueOf方法,返回值是[1, 2, 3],发现也并未像我们想象的一样返回数值类型的表示。

其实真正的理解是这样的:调用对象的toString()方法可以将对象转化为字符串,但是如果要转化为字符串不一定是调用toString方法。

我们再看看下面的代码。

代码1

上述代码1中我们定义了一个对象obj,定义了valueOf和toString方法的返回值,通过与1比较相等,发现其优先调用了valueOf方法。

然后定义了一个对象obj2,定义了valueOf和toString方法的返回值,通过与1比较相等,发现其调用的是toString方法。

然后我们看下面一段代码。

代码2

上述代码2中定义一个对象obj,通过与字符串'a'比较发现其调用的是valueOf方法。

然后对象obj2与'a'的比较返回false,发现其并未调用toString方法。

由此我们可以得出结论:

对象转化为简单类型时会优先调用valueOf方法,如果可以与简单值进行比较则会直接比较,此时不再调用toString方法。如果调用valueOf方法后无法与简单值进行比较,则会再调用toString方法,最终得到比对的结果。

但是需要注意的一点是Date对象不满足上述的规则,Date对象的toString和valueOf方法都是重新定义过的,默认会调用toString方法。

举例练习

以下是一些举例练习题,看看跟你想的答案都一样吗?

举例练习

结束语

本篇文章的知识点:Javascript中双等号隐性转换机制,你学会了吗?

感兴趣的同学可以加下我自己创建的Q群,大家相互学习交流,我也会尽力维护好群环境,群号如下所示。

群号

标签: #js一个等号和两个等号的区别 #js中双等号和三等号的区别 #js三个等号与两个等号