关于NaN:
NaN ,即非数值(Not a Number)是一个特殊的数值,这个数值用于表示一个本来要返回数值的操作数未返回数值的情况(这样就不会抛出错误了)。任何与NaN进行运算的结果均会为NaN,NaN与自身不相等(NaN不与任何值相等)。
NaN 属性是代表非数字值的特殊值。该属性用于指示某个值不是数字.
ES5 比较两个值是否相等,只有两个运算符:相等运算符(==)和严格相等运算符(===)
ES6 提出 “Same-value equality” (同值相等)算法
"=="
1、如果两个值类型相同,进行 === 比较。 2、如果两个值类型不同,他们可能相等。根据下面规则进行类型转换再比较: a、如果一个是null、一个是undefined,那么[相等]。 b、如果一个是字符串,一个是数值,把字符串转换成数值再进行比较。 c、如果任一值是 true,把它转换成 1 再比较;如果任一值是 false,把它转换成 0 再比较。 d、任何其他组合,都[不相等]。
"==="
1、如果类型不同,就[不相等]
2、如果两个都是数值,并且是同一个值,那么[相等]。
3、如果两个都是字符串,每个位置的字符都一样,那么[相等];否则[不相等]。
4、如果两个值都是true,或者都是false,那么[相等]。
5、如果两个值都引用同一个对象或函数,那么[相等];否则[不相等]。
6、如果两个值都是null,或者都是undefined,那么[相等]。
注意:"==="中认为,NaN 与 NaN 不等,-0 与+0会被认为相同。
"Object.is()"
如果满足以下条件则两个值相等:
注意:+0 与-0不想等,NAN 与NAN 相等
与== (en-US) 运算不同。 ==
运算符在判断相等前对两边的变量(如果它们不是同一类型) 进行强制转换 (这种行为的结果会将 "" == false
判断为 true
), 而 Object.is
不会强制转换两边的值。
与=== (en-US) 运算也不相同。 ===
运算符 (也包括 ==
运算符) 将数字 -0
和 +0
视为相等 ,而将Number.NaN 与NaN视为不相等.