ES6标准中的相等比较算法 SameValue、SameValueZero

1、相等比较算法
The Abstract Equality Comparison Algorithm ( ==)
The Strict Equality Comparison Algorithm ( === )
SameValue (Object.is())
SameValueZero (暂未提供API)
2、SameValue

对于前端研发来说,== 和 === 比较算法肯定已经深入了解了。

对于熟练使用ES6的小伙伴,多知道Object.is()这个方法:

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

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

3、SameValueZero

但是你在使用es6中有没有疑惑这种情况:

 const s = new Set()
  s.add(0)
  s.add(NaN)
  s.has(-0) // true
  s.has(NaN) // true
  • 1
  • 2
  • 3
  • 4
  • 5

是不是与上述的三种算法的表现多不一样,这就是第四种比较算法SameValueZero,它与SameValue的区别主要在于0与-0是否相等。

所以你在实践includes方法时,遇到:

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

就不用大惊小怪了,因为includes内部使用的比较算法就是SameValueZero。

几个比较规范
SameValueNonNumber
这个规范规定比较的值 x 和 y 都不为 Number 类型,照抄规范如下:

(1)x 的类型不为 Number 类型
(2)y 的类型与 x 的类型一致
(3)如果 x 的类型为 Undefined ,返回 true
(4)如果 x 的类型为 Null ,返回 true
(5)如果 x 的类型为 String,并且 x 和 y 的长度及编码相同,返回 true,否则返回 false
(6)如果 x 的类型为 Boolean ,并且 x 和 y 同为 true 或同为false ,返回 true,否则返回 false
(7)如果 x 的类型为 Symbol ,并且 x 和 y 具有相同的 Symbol 值,返回 true,否则返回 false
(8)如果 x 和 y 指向同一个对象,返回 true, 否则返回 false
Strict Equality Comparison
js 中的全等(===)便是遵循这个规范,照搬规范如下:

(1)如果 x 和 y 的类型不同,返回 false
(2)如果 x 的为 Number 类型:
a. 如果 x 为 NaN ,返回 false
b. 如果 y 为 NaN ,返回 false
c. 如果 x 和 y 的数值一致,返回 true
d. 如果 x 为 +0 并且 y 为 -0 ,返回 true
e. 如果 x 为 -0 并且 y 为 +0 ,返回 true
f. 返回 false
(3)按照 SameValueNonNumber 的结果返回
SameValue
规范如下:

(1)如果 x 和 y 的类型不同,返回 false
(2)如果 x 的类型为 Number
a. 如果 x 为 NaN 并且 y 为 NaN ,返回 true
b. 如果 x 为 +0 并且 y 为 -0 ,返回 false
c. 如果 x 为 -0 并且 y 为 +0 , 返回 false
d. 如果 x 和 y 的数值一致,返回 true
e. 返回 false
(3)按照 SameValueNonNumber 的结果返回
SameValueZero
这个是 eq 遵循的规范,如下:

(1)如果 x 和 y 的类型不同,返回 false
(2)如果 x 的类型为 Number
a. 如果 x 为 NaN 并且 y 为 NaN ,返回 true
b. 如果 x 为 +0 并且 y 为 -0 ,返回 true
c. 如果 x 为 -0 并且 y 为 +0 , 返回 true
d. 如果 x 和 y 的数值一致,返回 true
e. 返回 false
(3)按照 SameValueNonNumber 的结果返回
小结:SameValueNonNumber 是基本,Strict Equality Comparison 、SameValue 和 SameValueZero 只是在对待 +0、-0 和 NaN 上有区别。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值