==、===、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不等于自身,所以可以用这样的方式来判断:

有一点需要补充,es6将isNaN非法放入Number上,并且不会发生隐式类型转换(Number.isNaN('1')结果是false),与全局的isNaN方法行为不一致。

4、Object.is()

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值