JavaScript相等判断的避坑实战指南

 更新时间:2022年08月25日 16:16:01   作者:梦想敲木鱼  
JavaScript中的相等性判断,在项目开发中,我经常会遇到,今天我们一起探讨下,下面这篇文章主要给大家介绍了关于JavaScript相等判断的避坑实战指南,文中通过实例代码介绍的非常详细,需要的朋友可以参考下

JS中的相等性

1、严格相等(===)

严格相等本质上是判断一个值是否与自身相等,在比较前不进行隐式类型转换。当被比较的两个值类型相同,值也相同,且不是Number类型时,这两个值是全等的。当两个值类型是Number时,我们需要注意NaN,NaN和NaN不相等,+0和-0全等,其余情况,只要值相等,就是全等的。

NaN === NaN //false
+0 === -0 // true
undefined === undefined //true
null === null //true
undefined === null //false
({}) === {} //false
3 === '3' //false
3 === 3 //true
true === true //true
false === 0 //false

2、非严格相等(抽象相等)(==)

判断比较的两个值是否相等,在比较前会转化为相同的类型,转换类型后,和严格相等(===)比较规则一致。

比较规则(A/B)undefinednullNumberStringBooleanObject
undefinedtruetruefalsefalsefalsefalse
nulltruetruefalsefalsefalsefalse
NumberfalsefalseA === BtoNumber(B)===AtoNumber(B)===AtoPrimetive(B) == A
StringfalsefalsetoNumber(A)===BA===BtoNumber(A)===toNumber(B)toPrimetive(B) == A
BooleanfalsefalsetoNumber(A)===BtoNumber(A)===toNumber(B)A===BtoPrimetive(B) == toNumber(A)
ObjectfalsefalsetoPrimitive(A) == BtoPrimitive(A) == BtoPrimetive(A) == toNumber(B)A===B
null == undefined // true
null == 0 // false
null == '' // false
null == 'null' //false
null == false // false
null == [] //false
null == {} //false
null == NaN //false
undefined == 0 //false
undefined == '' //false
undefined == 'undefined' //false
undefined == false //false
undefined == [] //false
undefined == {} //false
undefined == NaN //false
'' == 0 //true
'' == false //true
'' == [] //true
'' == {} // false
0 == false // true
0 == [] // true
0 == {} // false
true == '1' //true
true == 'true' //false
true == 1 // true
true == [] //false
false == [] //true
true == {} //false
([]) == [] //false
({}) == {} //false
3 == '3'  //true
NaN == NaN // false
+0 == -0 // true

总结规律可得: undefined和null认为值相等,但是当undefined和null与其他类型进行相等比较时,不进行隐式类型转换,与其他的任何类型值都不相等,所有对象与undefined和null不相等,但是有个特例,如:document.all == undefineddocument.all == null均为true

严格相等和非严格相等比较可得:严格相等的结果更具预测性,且无需进行类型转换,效率也更高

3、同值相等

同值相等是用来判断两个值是否是同一个值,通过Object.is()来判断,是es6新方法。有点类似于严格相等,不会对传入的两个参数值进行隐式类型转换,但是与严格相等又不完全相同,在对待+0、-0以及NaN上不一致

  • 都是undefined
  • 都是null
  • 相同的两个字符串
  • 都是true或者都是false
  • 引用值相同的两个对象
  • 都是NaN
  • 都是不为NaN且不为0的值相同的数字
  • 都是+0或者都是-0
Object.is(NaN, NaN) //true
Object.is(NaN, 0 / 0) // true
Object.is(+0, -0) // false
Object.is(+0, +0) //true
Object.is(undefined, undefined) //true
Object.is(null, null) //true
Object.is(undefined, null) //false
Object.is({}, {}) //false
Object.is(3, '3') //false
Object.is(3, 3) //true
Object.is(true, true) //false
Object.is(false, 0) //false

4、零值相等

**与同值相等类似,认为+0和-0相等**

Object.is()实现方案

// 实现方案:
Object.defineProperty(Object, "is", {
    value: function (x, y) {
        if (x === y) {
            // 需要区分一下+0和-0
            return x !== 0 || 1 / x === 1 / y
        } else {
            // 需要区分一下NaN
            return x !== x && y !== y
        }
    }
})

总结

到此这篇关于JavaScript相等判断避坑的文章就介绍到这了,更多相关JavaScript相等判断避坑内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Bootstrap表格制作代码

    Bootstrap表格制作代码

    这篇文章主要为大家详细介绍了Bootstrap表格的制作代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • 用js简单提供增删改查接口

    用js简单提供增删改查接口

    这篇文章主要介绍了用js简单提供增删改查接口,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • javascript克隆元素样式的实现代码

    javascript克隆元素样式的实现代码

    这是一个实验用的玩意,它可以克隆指定元素的最终样式,并包装成一个css类,它还可以证明Oprea 11.10 是个混球
    2011-10-10
  • 关于JavaScript数组去重的一些理解汇总

    关于JavaScript数组去重的一些理解汇总

    这篇文章主要给大家介绍了关于JavaScript数组去重的一些理解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • IE6-8中Date不支持toISOString的修复方法

    IE6-8中Date不支持toISOString的修复方法

    这篇文章主要介绍了IE6-8中Date不支持toISOString的修复方法,需要的朋友可以参考下
    2014-05-05
  • 前端精度丢失问题解决之后端Long类型到前端的处理策略

    前端精度丢失问题解决之后端Long类型到前端的处理策略

    这篇文章主要介绍了前端精度丢失问题解决之后端Long类型到前端的处理策略,在Web开发中前后端数据类型不匹配尤其是Long类型数据到前端可能导致精度丢失,文章探讨了此问题并提供三种解决方法,需要的朋友可以参考下
    2024-09-09
  • 自己写的Javascript计算时间差函数

    自己写的Javascript计算时间差函数

    Javascript计算时间差函数,获得时间差,时间格式为 年-月-日 小时:分钟:秒 或者 年/月/日 小时:分钟:秒。
    2013-10-10
  • 关于layer.js使用心得-向弹出框传值问题

    关于layer.js使用心得-向弹出框传值问题

    这篇文章主要介绍了关于layer.js使用心得-向弹出框传值问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • js表单登陆验证示例

    js表单登陆验证示例

    这篇文章主要介绍了js表单登陆验证的方法,基于thinkPHP前端页面实现javascript针对表单用户名与密码的验证功能,需要的朋友可以参考下
    2016-10-10
  • javascript中错误使用var造成undefined

    javascript中错误使用var造成undefined

    这篇文章主要介绍了javascript中错误使用var造成undefined的原因,实例分析了错误使用var造成undefined的过程,感兴趣的小伙伴们可以参考一下
    2016-03-03

最新评论