在Javascript中比较NaN值是否相等

时间:2012-01-22 22:40:44

标签: javascript comparison equality nan

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

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

工作正常,但对我来说看起来很臃肿。我想让它更简洁。有什么想法吗?

12 个答案:

答案 0 :(得分:51)

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

无需改进。只需添加括号即可让每个人都清楚。

答案 1 :(得分:24)

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

isNaN(undefined) // true

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

// 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

答案 2 :(得分:5)

if ( val1 === val2 )

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

此外,NaN !== NaN

答案 3 :(得分:5)

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

当你决定undefined也应该等于undefined时,这也有利于本地化算法的变化。

答案 4 :(得分:5)

只要您知道这两个变量是数字,您可以尝试:

if (val1 + '' == val2 + '')

它将两个值转换为字符串。一个有趣的答案,但它应该工作。 :)

答案 5 :(得分:5)

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

两者都未定义

均为空

既是真的又是假的

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

同一个对象

两个数字和

+0

-0

NaN

e.g。 Object.is(NaN,NaN)=>真

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

答案 6 :(得分:2)

关于 Number.isNaN()的功能是什么?我相信必须尽可能使用它。

> NaN === NaN
false
> Number.isNaN
ƒ isNaN() { [native code] }
> Number.isNaN() === Number.isNaN()
true

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/isNaN

答案 7 :(得分:2)

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

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

全局isNaN的原因是错误的。它会在

等场景中给出错误的结果
isNaN(undefined); // true
isNaN({});        // true
isNaN("lorem ipsum"); // true 

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

  

How to test if a JavaScript variable is NaN

答案 8 :(得分:1)

我在回顾了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);
}

答案 9 :(得分:-1)

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

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

答案 10 :(得分:-1)

与NaN的平等比较总是产生False

我们可以使用javascript函数isNaN()来检查与NaN的相等性。 示例:

1. isNaN(123) //false

2. var array = [3, NaN];

for(var i = 0 ; i< array.length; i++){
  if(isNaN(array[i])){
      console.log("True ---- Values of " + i);
    } else {
      console.log("false ---- Values of " + i);
    }
}

结果:

  

false ----值为0

     

真----值1

答案 11 :(得分:-1)

使用Array.prototype.includes MDN link找到另一种方法。显然,[NaN] .includes(NaN)对于NaN返回true。

function IsActuallyNaN(obj) {
  return [obj].includes(NaN);  
}

或者我们可以和davidchambers一起去&#39;解决方案更简单。

function IsActuallyNaN2(obj) {
  return obj !== obj;
}