js 数据是否相等比较
最近编辑于
js判断两个变量是否相等
- == 宽松相等,不同类型之间对比会进行隐式类型转换,规则:
- 同类型直接比较
- 对象之间比较的是引用地址
- number类型和string类型,string类型转为number
- number类型和Boolean类型,boolean类转为number
- 基础数据和引用数据对比,引用数据转为基础数据
- null和undefined和相等,和其他数据不相等
- NaN不等于任何值包括自己
1 == '1' // true
0 == false // true
'' == 0 // true
' ' == 0 // true
null == undefined // true
null == 0 // false
undefined == 0 // false
NaN == NaN // false
[] == '' // true
[] == 0 // true
[1] == 1 // true
[1] == '1' // true
[1,2] == '1,2' // true
[] == false // true
{} == '[object Object]' // true
[0] == false // true
[null] == '' // true
[undefined] == '' // true
[] == ![] // true
'' == false // false
- === 严格相等,首先判断类型,类型不对返回false,同类型比较值,一些特殊情况
- NaN 不等于 NaN
- +0 === -0 为true
NaN === NaN // false +0 === -0 // true
== 和 === 的问题
- ==在不同类型比较时会有类型转换问题,规则比较复杂,有时候会产生违反常识感觉的结果。比如:[] == ![], 第一直觉是false,但返回的是true,在直接开发中并不推荐使用。
- === 严格相等避免类型隐式转换的问题,但是也有一些特殊规则,比如:NaN === NaN , +0 === -0,在理解上第一个应该是true,第二个是false才对。但是恰恰相反。
Object.is()
为了解决上面提到的问题NaN和+0,-0的问题,可以使用Object.is() 这个函数来处理。即NaN等于NaN,区分+0 和 -0: +0 和 -0不相等, -0和0不相等,+0和0相等 。其内置的处理算法有一个专门的名称叫:SameValue
Object.is(+0, -0) // false Object.is(+0, 0) // true Object.is(-0, 0) // false Object.is(NaN, NaN) // true
其他带比较的js方法或者数据类型用的算法
除了我们手动使用==,===或者Object.is()。有一些js方法或者数据本身就自带内置的比较逻辑,比如:include、indexof、set、map。
- include,使用的是SameValueZero,他和SameValue区别是,不区分+0和-0,他们是相等的,其他特性和object.is()一样,比如NaN等于NaN, 介于=== 和 object.is() 之间
console.log([+0].includes(-0)) // true console.log([+0].includes(0)) // true console.log([-0].includes(0)) // true console.log([-0].includes(+0)) // true console.log([0].includes(+0)) // true console.log([0].includes(-0)) // true console.log([NaN].includes(NaN)) // true
- set 和 map,使用SameValueZero
console.log(new Set([+0, -0])) // Set(1) { 0 }
console.log(new Set([+0, 0])) // Set(1) { 0 }
console.log(new Set([NaN, NaN])) // Set(1) { NaN }
- indexof,使用 ===
console.log([NaN].indexOf(NaN)) // -1 console.log([+0].indexOf(0)) // 0
评论 (0)
暂无评论,成为第一个评论者!