JS 中的相等

2020-06-16  本文已影响0人  Mr君

SameValueNonNumber 计算非数字类型x,y是否相同

规则:

  1. x 不是 Number 类型。
  2. x 和 y 是 相同类型。
  3. 如果 x 是 Undefined 类型,返回 true 。
    如果 x 是 Null 类型,返回 true 。
    如果 x 是 String 类型:当且仅当x,y字符序列完全相同(长度相同,每个位置上的字符也相同)时返回true,否则返回false
    如果 x 是 Boolean 类型:如果 x 和 y 都是true 或者 都是false,返回 true 。否则返回 false 。
    如果 x 是 Symbol 类型:如果x,y是相同的Symbol值,返回true,否则返回false
    如果 x 和 y 指向同一对象,返回 true 。否则返回 false 。

SameValueNonNumber 是 SameValue、SameValueZero、 === 的公共方法

SameValue

ES6中的Object.is()正是采用这种算法
下面是SameValue 与===的有区别的两种情况

  Object.is(NaN, NaN) // true
  Object.is(0, -0) // false

  NaN === NaN // false
   0 === -0 // true

SameValueZero

它与SameValue的区别主要在于0与-0是否相等
includes方法的内部采用SameValueZero方法

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

还有以下方法中采用了SameValueZero

Array.prototype.includes
Map.prototype.delete
Map.prototype.has
Map.prototype.set
Set.prototype.delete
Set.prototype.has
Set.prototype.add
ArrayBuffer 和 DataView 部分方法

=== 严格相等运算

采用了 SameValueNonNumber算法
但是

NaN === NaN // false
0 === -0 // true

以下方法 内部采用了===

Array.prototype.indexOf
Array.prototype.lastIndexOf
上一篇 下一篇

猜你喜欢

热点阅读