SameValueNonNumber 计算非数字类型x,y是否相同
规则:
- x 不是 Number 类型。
- x 和 y 是 相同类型。
- 如果 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
网友评论