聊一聊相等运算与 SameValue

2019-12-04 16:21:30 浏览数 (1)

本文作者:IMWeb etoileli 原文出处:IMWeb社区 未经同意,禁止转载

变量的运算是日常开发中必须且频繁接触的内容。

其中 相等运算符 可算是使用频率最高的运算符。

除了直接使用之外,我们平常使用的过滤、映射、排序等等,当然都会进行值的比较。

类型转换

有一定基础的开发中都知道,

JavaScript 中使用相等运算符,会进行类型转换,

举个例子:

代码语言:javascript复制
'1' == 1 // true
true == 1 // true

类型转换,在开发上,有时候会带给我们一些便利。

例如少写几句代码:)

但类型转换也会隐藏陷阱,就像下面的例子:

代码语言:javascript复制
'0' == 0 // true
!!'0' == 0 // false

假设字符串 0 跟 数字 0 均使用变量,

就会写出非常不直观,不符合直觉的代码:

代码语言:javascript复制
a == b // true
!!a == b // false

当然,如果我们使用了 === 全等运算符,就可以避免掉坑啦。

所以,在日常工作中,要多使用 === 哦。

SameValue 与 SameValueZero

SameValueSameValueZero 会被成对提及的内容。

这两个玩意是用来做什么的呢?

SameValueSameValueZero 其实是 ecma 中,比较值是否相等的算法,具体参考如下:

SameValue :http://ecma-international.org/ecma-262/6.0/#sec-samevalue

SameValueZero :http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero

SameValueSameValueZero 是为了解决什么问题的嗯?

举个例子,我们都知道 NaN 的定义是与任何其他值均不相等。

因此,就会有以下结果:

代码语言:javascript复制
NaN == NaN // false
NaN === NaN // false

有的时候,我们还是希望可以判断 NaN ,因此就诞生了 SameValue

代码语言:javascript复制
SameValue(NaN, NaN); // true

SameValue 就像字面意思 Same Value ~

所以,对于 0-0 则会认为是不同的值:

代码语言:javascript复制
 0 == -0 // true
 0 === -0 // true
SameValue( 0, -0); // false

以上两种情况,就是 SameValue=== 不同的地方。(判断 NaN, 0,-0 时)

那么还有,SameValueZero

使用 SameValueZero 的话,对于 0-0 则会认为是同一个值:

代码语言:javascript复制
 0 == -0 // true
 0 === -0 // true
SameValue( 0, -0); // false
SameValueZero( 0, -0); // true

所以, SameValueZero=== 只有一个不是的情况。(判断 NaN 时)

lodash

我们经常使用的 lodash,也有大量使用 SameValueZero,有兴趣的同学,可以都了解一下~

以上就是关于相等运算与 SameValue的内容,谢谢。

0 人点赞