我需要在Javascript中比较两个数值相等。值也可能是NaN
。我想出了这段代码:
if (val1 == val2 || isNaN(val1) && isNaN(val2)) ...
这工作正常,但它看起来很臃肿。我想让它更简洁。有任何想法吗?
if(val1 == val2 || (isNaN(val1) && isNaN(val2)))
没什么可改进的。只需添加括号即可让每个人都清楚。
为什么不这样的if语句呢?
if (isNaN(x) == true){
alert("This is not a number.");
}
与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
找到另一种使用Array.prototype.includes MDN link的方法。显然,[NaN] .includes(NaN)对于NaN返回true。
function IsActuallyNaN(obj) {
return [obj].includes(NaN);
}
或者我们可以使用更简单的davidchambers解决方案。
function IsActuallyNaN2(obj) {
return obj !== obj;
}
避免使用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
if ( val1 === val2 )
如果其中一个或两个都是NaN
,它将评估为假。
还有,NaN !== NaN
只要您知道这两个变量是数字的,您可以尝试:
if (val1 + '' == val2 + '')
它将两个值转换为字符串。一个有趣的答案,但它应该工作。 :)
无论比较方法如何,NaN永远不会与自身相等,所以我能想到的唯一更简洁的问题解决方案是创建一个带有描述性名称的函数调用来进行这种相当特殊的比较,并使用你的比较函数代码而不是。
这也有利于在您确定undefined也应该等于undefined的那一天本地化算法的更改。
尝试使用Object.is()
,它确定两个值是否相同。如果满足下列条件之一,则两个值相同:
undefined
null
true
或两个false
+0
两个-0
两个NaN
或两者都非零,两者都不是NaN
,两者都具有相同的值例如Object.is(NaN, NaN)
=> true
请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is
对于Numeric案例,解决方案很好,但要扩展它以适用于其他数据类型,我的建议如下:
if(val1 === val2 || (val1 !== val1 && val2 !== val2))
全球isNaN
的原因是错误的。在诸如此类的情况下,它会给你错误的结果
isNaN(undefined); // true
isNaN({}); // true
isNaN("lorem ipsum"); // true
我在这里发布了一个全面的答案,其中涵盖了NaN对平等的比较。
什么是函数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
在回顾了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);
}