javascript - js相等表 - mdn




在Javascript中比较NaN值是否相等 (8)

我需要在Javascript中比较两个数值相等。 值也可以是NaN 。 我想出了这段代码:

if (val1 == val2 || isNaN(val1) && isNaN(val2)) ...

这工作正常,但它看起来很臃肿。 我想让它更简洁。 有任何想法吗?


if ( val1 === val2 )

如果其中一个或两个都是NaN ,它将评估为false。

此外, NaN !== NaN


尝试使用Object.is() ,它确定两个值是否是相同的值。 如果满足下列条件之一,则两个值相同:

都未定义

都是空的

两者都是真的或都是假的

两个相同长度的字符串,具有相同顺序的相同字符

两个相同的对象

数字和数字

两者都是+0

两者都是-0

两个NaN

例如,Object.is(NaN,NaN)=> true

请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is


为什么不这样的if语句呢?

if (isNaN(x) == true){
        alert("This is not a number.");
    }


在回顾了ThiefMaster,Esailija,Joachim Isaksson和davidchambers的建议后,我创建了这个答案。 这可以进一步改善吗?

// Determines if two numeric values are equal.
// Also returns true when both parameters are NaN.
function areEqualNumeric(val1, val2) {
    return val1 === val2 || (val1 !== val1 && val2 !== val2);
}

对于Numeric案例,解决方案很好,但要扩展它以适用于其他数据类型,我的建议如下:

if(val1 === val2 || (val1 !== val1 && val2 !== val2))

全球化的原因是isNaN是错误的。 在诸如此类的情况下,它会给你错误的结果

isNaN(undefined); // true
isNaN({});        // true
isNaN("lorem ipsum"); // true 

我在这里发布了一个全面的答案,其中涵盖了NaN对平等的比较。

如何测试JavaScript变量是否为NaN


无论比较方法如何,NaN永远不会与自身相等,所以我能想到的唯一更简洁的问题解决方案是创建一个带有描述性名称的函数调用来进行这种相当特殊的比较,并使用你的比较函数代码而不是。

这也有利于在您确定undefined也应该等于undefined的那一天本地化算法的更改。


避免使用isNaN 。 它的行为具有误导性:

isNaN(undefined) // true

_.isNaN (来自_.isNaN )是一个优雅的函数,其行为符合预期:

// Is the given value `NaN`?
// 
// `NaN` is the only value for which `===` is not reflexive.
_.isNaN = function(obj) {
  return obj !== obj;
};

_.isNaN(undefined) // false
_.isNaN(0/0) // true




nan