隐式类型转换(==的情况)

来源:互联网 发布:淘宝旧版本5.4.9下载 编辑:程序博客网 时间:2024/06/16 06:10

(前言:这也是前端面试的高频考点,虽然平时大家肯定都接触过或经常使用,但这个问题真的较起真来细细的问,相信很多人都会懵,在《你不知道的js:中卷》里有对这块知识较为详细的详细介绍,推荐大家去看看)

正文 :

==在比较两个不同类型的值时会发生隐式类型转换,会将其中之一或两者都转换为相同类型后再进行比较。

===是严格比较两个值相等(两个特例,NaN不等于NaN,+0等于-0),不会发生隐式类型转换。

那具体转换的规则是什么呢?

一、字符串和数字做相等比较,会把字符串转为数字

var a = 10;var b = "10";a==b //truea===b //false

二、有布尔值的,把布尔值转为数字

var a = true;var b = "1";a==b //true

这里的过程就是先把a转为数字,就是1,等式就变为 1==”1” ,再遵照第一条,所以最终结果为true。

三、在==中,null和undefined相等

var a = null;var b;a==b //true

四、对象(对象/函数/数组)和标量基本类型(字符串/数字/布尔值)之间的相等比较,调用对象的ToPrimitive

具体流程是这样的,先检查对象是否有valueOf方法,如果有并且返回基本类型值,就使用该值进行类型转换(像Number(1),String(‘a’),Boolean(true)这种对象可以,前面加上new也行,会返回传进去的数字,字符串或布尔值)。如果没有就使用toString()方法的返回值进行类型转换。

注意:
1.用Object.create(null)创建的对象没有valueOf和toString方法。

2.我们平时写的对象(像var obj = {…})toString后为”[object Object]”

3.数组的valueOf会返回数组本身,所以会调用数组原型链上的toString方法(与对象原型链上的不同,Object.prototype.toString.call(arr)结果为[object Array],常用这个方法区分对象与数组)。
[null]和[undefined]的toString结果为“ ”。

var a = 'abc';var b = Object(a) //和new String(a)一样a==b //true,调用了valueOf方法var c = 2;var d = [2];c==d //true,[2]先转为“2”,再转为数字2

有几个稍特殊的例子:

null和undefined是没有对应的对象的,所以:

var a = null; //undefined也同理var b = Object(a);a==b //false

把NaN封装成函数:

var a = NaN;var b = Object(a); //和new Number(a)a==b //false,它遵守了规则,因为NaN==NaN本来就是false
[]==![] //true

这是因为 ![]转为布尔值为false,false变为数字后是0,[]toString后为“ ” , “ ”==0 –>true。

例子就举到这吧,这种东西如果真举例子,相信永远也举不完,而且也不可能挨个去背,大家主要了解它内部转换规则。

github 的@dorey做过一张表格,里面基本列举了通常的转换结果,但可能由于时间过久,我找到那个项目时貌似已经废弃了,所以只能给大家放张av画质的照片了,以后有好的我再改。

这里写图片描述

这块的知识点繁多又零碎,肯定有不少拉下的地方,欢迎大家帮我指出,帮我完善~~