Ответ 1
if(val1 == val2 || (isNaN(val1) && isNaN(val2)))
Ничего не улучшится. Просто добавьте круглые скобки, чтобы они поняли всем.
Мне нужно сравнить два числовых значения для равенства в Javascript. Значения могут быть NaN
.
Я придумал этот код:
if (val1 == val2 || isNaN(val1) && isNaN(val2)) ...
который работает нормально, но он выглядит раздутым. Я хотел бы сделать его более кратким. Любые идеи?
if(val1 == val2 || (isNaN(val1) && isNaN(val2)))
Ничего не улучшится. Просто добавьте круглые скобки, чтобы они поняли всем.
Избегайте 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
, он будет оцениваться как false.
Кроме того, NaN !== NaN
NaN никогда не совпадает с самим собой независимо от метода сравнения, поэтому единственным более сжатым решением для вашей проблемы, о котором я могу думать, было бы создание вызова функции с описательным именем для этого довольно специального сравнения и использования этого сравнения вместо этого в вашем коде.
Это также будет иметь преимущество локализации изменений алгоритма в тот день, когда вы решите, что undefined должен быть равен undefined.
Пока вы знаете, что эти две переменные являются числовыми, вы можете попробовать:
if (val1 + '' == val2 + '')
Он превращает два значения в строки. Смешной ответ, но он должен работать.:)
Попробуйте использовать 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.
А как насчет функции 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
Для числовых случаев решение отлично, но для его расширения для работы с другими типами данных, мое предложение будет следующим:
if(val1 === val2 || (val1 !== val1 && val2 !== val2))
Причина глобального isNaN
ошибочна. Это даст вам неправильные результаты в таких сценариях, как
isNaN(undefined); // true
isNaN({}); // true
isNaN("lorem ipsum"); // true
Я разместил здесь всеобъемлющий ответ, который также охватывает сравнение NaN для равенства.
Я создал этот ответ после рассмотрения предложений 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);
}
Почему не утверждение 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
True ---- Значения 1
Нашел другой способ, используя Array.prototype.includes ссылка MDN. По-видимому, [NaN].includes(NaN) возвращает true для NaN.
function IsActuallyNaN(obj) {
return [obj].includes(NaN);
}
Или мы можем пойти с решением davidchambers, которое намного проще.
function IsActuallyNaN2(obj) {
return obj !== obj;
}