# 相等性判断 true/false
1、相等比较算法
- The Abstract Equality Comparison Algorithm (==)
- The Strict Equality Comparison Algorithm (===)
- SameValue (Object.is())
- SameValueZero (暂未提供API)
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Equality_comparisons_and_sameness
== 和 ===
# 严格相等 ===
全等操作符比较两个值是否相等,两个被比较的值在比较前都不进行隐式转换。
如果类型不同,则不等。
⚠️:
undefined === null // false
obj === undefined // false
obj === null // false
NaN === NaN; // false
+0 === -0 // true
1
2
3
4
5
2
3
4
5
被比较值钱会进行格式转换,如果二者格式不同,会转换成Number类型,再进行对比。
# 非严格相等 ==
相等操作在比较前,会进行隐式转换,将俩个比较值转换成相同类型。然后再进行类似全等的操作。
Number == String // 先将String转换成Number类型(Number.parseInt/Number.parseFloat), 再进行数值比较===
Number == Boolean // 操作与String类似,不过true和false 转Number都为NaN
Number == Object // 先将对象进行Symbol.toPrimitive(是一个内置的 Symbol 值,它是作为对象的函数值属性存在的,当一个对象转换为对应的原始值时,会调用此函数。) 操作
# 当被比较的两个值类型不同时,只要其中一个是对象,就对该对象进行Symbol.toPrimitive 操作;若其中一个是Boolean类型的,将Boolean值转换成Number类型
1
2
3
4
5
2
3
4
5
# Object.is()
ES6提供了object.is()方法,用于判断两个值是否为同一个值 (opens new window)。
syntax:
Object.is(value1, value2);
Object.is(NaN, NaN) // true
Object.is(0, -0) // false
NaN === NaN // false
0 === -0 //true
1
2
3
4
5
2
3
4
5
Object.is内部采用的比较算法就是SameValue(x, y),而它与 === 的区别也正是这两种情况。
# Array.includes()
const a = [0, NaN]
a.includes(-0) // true
a.includes(NaN) // true
1
2
3
2
3
includes内部使用的比较算法就是SameValueZero。
# 类型转换
深入浅出弱类型JS的隐式转换 (opens new window)
# Number转Boolean
!!1 // true
!!0 // false
!!'1' // true
1
2
3
2
3