比较Javascript中的NaN值是否相等
我需要比较Javascript中的两个数值是否相等。这些值也可以是比较Javascript中的NaN值是否相等,javascript,comparison,equality,nan,Javascript,Comparison,Equality,Nan,我需要比较Javascript中的两个数值是否相等。这些值也可以是NaN。 我想出了以下代码: if (val1 == val2 || isNaN(val1) && isNaN(val2)) ... 这很好用,但我觉得它太臃肿了。我想让它更简洁。有什么想法吗 if(val1 == val2 || (isNaN(val1) && isNaN(val2))) 没有什么可以改进的。只要加上括号,大家就明白了。if(val1==val2) 如果其中一个或两个为NaN,
NaN
。
我想出了以下代码:
if (val1 == val2 || isNaN(val1) && isNaN(val2)) ...
这很好用,但我觉得它太臃肿了。我想让它更简洁。有什么想法吗
if(val1 == val2 || (isNaN(val1) && isNaN(val2)))
没有什么可以改进的。只要加上括号,大家就明白了。if(val1==val2)
如果其中一个或两个为NaN,则其计算结果将为false
而且,
NaN!==NaN
无论采用何种比较方法,NaN都不等于它自己,因此我能想到的解决问题的唯一更简洁的方法是创建一个具有描述性名称的函数调用,用于进行这种非常特殊的比较,并在代码中使用该比较函数
这还有一个好处,就是在您决定undefined也应该等于undefined的那一天,将对算法的更改本地化 只要您知道这两个变量是数字,您可以尝试:
if (val1 + '' == val2 + '')
它将两个值转换为字符串。这是一个有趣的答案,但它应该有用。:) 避免
isNaN
。其行为具有误导性:
isNaN(undefined) // true
\ isNaN
(from)是一个优雅的函数,其行为符合预期:
// 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
我在回顾了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);
}
函数Number.isNaN()是什么?我认为这必须在任何可能的时候使用
> NaN === NaN
false
> Number.isNaN
ƒ isNaN() { [native code] }
> Number.isNaN() === Number.isNaN()
true
为什么不像这样的if语句呢
if (isNaN(x) == true){
alert("This is not a number.");
}
对于数字情况,该解决方案很好,但要将其扩展到其他数据类型,我的建议如下:
if(val1 === val2 || (val1 !== val1 && val2 !== val2))
全局原因是错误的。在以下情况下,它会给您错误的结果:
isNaN(undefined); // true
isNaN({}); // true
isNaN("lorem ipsum"); // true
我在这里发布了一个全面的答案,其中包括了NaN的平等比较
与NaN的相等比较总是导致
False
我们可以使用javascript函数isNaN()
检查与NaN的相等性。
例如:
1。伊斯南(123)//错
2.var数组=[3,NaN];
对于(var i=0;i
结果:
false----值为0
真——1的值
找到了使用Array.prototype.includes的另一种方法。显然,[NaN].includes(NaN)为NaN返回true
function IsActuallyNaN(obj) {
return [obj].includes(NaN);
}
或者我们也可以采用大卫·汉伯斯的解决方案,它简单得多
function IsActuallyNaN2(obj) {
return obj !== obj;
}
尝试使用
Object.is()
,它确定两个值是否相同。如果满足以下条件之一,则两个值相同:
- 两者均
未定义
- 两个
null
- 两者均
或两者均true
false
- 两个长度相同且字符顺序相同的字符串
- 两者都是同一对象
- 数字和
- 两个
+0
- 两者都
-0
- 两个
NaN
- 或者两者均为非零且均不
,且均具有相同的值NaN
- 两个
Object.is(NaN,NaN)
=>true
没有括号的混合
|
和&
非常难看和令人困惑。NaN
和NaN
被认为是不平等的,因为,例如,0/0
和parseInt(“不是数字!”
,而它们的计算结果都是NaN
,不应被视为相等。@Peter有时这种差异与算法无关。我认为OP就是这种情况。我应该用一条注释来改进它,解释为什么NaN===NaN
应该返回true。它不会总是给出与原始代码相同的结果,但是,在它可能不同的情况下,它可能是一种首选行为。例如“”==0
,它是true
,但与您的代码一起将是false
。这可能被认为是一种改进。isNaN(未定义)
为true
有什么不对<代码>未定义不是数字。对你来说,什么东西这么容易让人误解?@trejder:NaN和undefined是不同的值。甚至不同的值类型。@davidchambers:True。这并不能改变事实,未定义
不是一个数字。这使我们得出一个结论,isNaN(未定义)
应该返回true
。事实上,NaN
和undefined
是不同的值和不同的值类型,这不会改变我的状态。因为这是一个完全不同的故事。或者指出我错在哪里。@trejder:关于isNaN应该回答哪个问题,我们有不同的想法。您认为isNaN(x)
应该等同于!isNumber(x)
,而我建议它应该告诉我们x的值是否正是NaN。如果你想知道一个值是否不是一个数字,Object.prototype.toString.call(x)!='[对象编号]“
更可取,因为它不允许有相互竞争的解释。@drigoangelo:如果您能自如地编写If(x!==x)
,并且有信心您团队的所有当前和未来成员都会明白这一点,那就太好了。如果不是,最好有一个函数来回答这个问题:这个值是NaN吗?不幸的是,内置的isNaN不是这个函数。这不是等价的吗?如果val1和val2都是NaN
,OP希望表达式返回true。我想不需要进一步改进,AngularJS使用完全相同的代码compare=函数(a,b){返回a==b | |(a!==a&&b!==b)}代码>当你在上面写答案的时候,尽量不要对你的代码做太多的解释。不要仅仅为此构造一个数组文本。如果你想
function IsActuallyNaN2(obj) {
return obj !== obj;
}