# 相等性判断 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

被比较值钱会进行格式转换,如果二者格式不同,会转换成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

# 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

Object.is内部采用的比较算法就是SameValue(x, y),而它与 === 的区别也正是这两种情况。

# Array.includes()

const a = [0, NaN]
a.includes(-0) // true
a.includes(NaN) // true
1
2
3

includes内部使用的比较算法就是SameValueZero。

# 类型转换

深入浅出弱类型JS的隐式转换 (opens new window)

# Number转Boolean

!!1 // true
!!0 // false
!!'1' // true
1
2
3