应用离不开数据,
数据离不开运算。
在实际项目中,
数据来源于服务端,
也来源于用户操作,
等等。
个人非常喜欢使用 lodash
这个库来操作数据,
无论是数组,还是对象,
都是复杂类型,也是数据集合。
我们需要对它们,
过滤、映射、排序、等等,
lodash
可以满足我们大量的日常需求,
提高开发效率。
那么 lodash
是怎么判断两个值是相等还是不等呢?
无论是过滤,还是排序,
都涉及判断,
判断两个值是相等还是不等。
我们都非常熟悉,
相等运算符 ==
同时,
我们应该知道,
相等运算符,
会进行类型转换,
举个例子,
'1' == 1 // true
true == 1 // true
毫无疑问,
类型转换,
在开发上,
带给我们巨大的便利。
JavaScript
不是强类型语言,
类似 Java
或者 Swift
,
需要去给每个变量定义类型。
但类型转换也会隐藏陷阱,
类如,
'0' == 0 // true
!!'0' == 0 // false
除了相等运算符,
当然还有,全等运算符 ===
,
全等运算符则需要类型相同的情况下,
才继续做比较。
并且 JavaScript
的全等运算符,
有以下两个例子,
NaN === NaN // false
+0 === -0 // true
因此,
有其他人提出,
不一样的相等运算规则。
回到最初提及的 lodash
,
lodash
内部大量的判断都是用 SameValueZero
规则做相等比较。
描述文档如下:
http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero
文档除了提及 SameValueZero
,
还有 SameValue
。
那我先说 SameValue
好了,
针对全等运算符,
提及的两个例子,
SameValue
则固定返回以下结果:
SameValue(NaN, NaN); // true
SameValue(+0, -0); // false
而被 lodash
广泛是用的 SameValueZero
则是:
SameValueZero(NaN, NaN); // true
SameValueZero(+0, -0); // true
其他情况下的判断结果,
与全等运算符的返回结果一致。
JSON
字符串作一个 相似度比较。