温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

JavaScript相等判断怎么避坑

发布时间:2022-08-26 10:14:32 来源:亿速云 阅读:134 作者:iii 栏目:开发技术

本篇内容介绍了“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相等判断怎么避坑”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    AI