==、===、isNaN、Object.is的比较以及相关的隐式类型转换问题分析

1、==

 ==是相等运算符,比较两个数据并返回boolean类型的值。比较的时候,会发生隐式类型转换。比如:

因为引用对象,比较的是指针指向的内存是否为同一个数据,所以

原因就是左右两边的数组(对象)是单独的,并不是同一块内存存储的数据。

2、===

全等运算符===。除了比较原始值,还会比较两个数据的类型,即不会发生隐式类型转换。

在此,就有一个有趣的问题需要说明一下。

首先确定,隐式类型转换为false的值,只有以下六种:空字符串(""),数字0(0),undefined,null,false本身,NaN。

看一下这个代码

想一下结果,然后试验一下:

很奇怪是不是。if([])为真,进了判断,然而类型转换之后又变成了false。

首先,遵循一个原则:[]不在上述六种数据以内,所以能够进入循环。

在执行[]==true的时候,因为右边是boolean类型,所以左边也会转换成布尔类型。引用类型的数据转换成布尔类型,首先会调用自身的valueOf方法,得到原始值,然后调用toString方法。空数组的原始值是它本身,所以空数组调用toString方法之后得到空字符串(""),转换成false。

如果是空对象,空对象执行toString方法,相当于执行Object,prototype.toString.call({}),结果是'[object Object]'。

Object,prototype.toString.call()方法也是检测数据类型一种方法,typeof不够精确。

3、isNaN

isNaN()是之前用来判断一个数据是否是NaN的方法,但是有很严重的缺陷。

NaN表示not a number,即不是数字。所有经过Number()方法转换得到NaN的数据,用isNaN来判断结果都是true。

空数组、空对象的问题,上文已经说明过。

那么,如何准确的判断一个数据是否是NaN呢?

NaN有一个特点,NaN不等于自身,所以可以用这样的方式来判断:

4、Object.is()

Object.is()是es6引入的、用于判断两个或者多个数据是否全等的方法。很重要的一个特点是Object.is(NaN,NaN)的结果是true

猜你喜欢

转载自blog.csdn.net/weixin_42733155/article/details/82154622