Подтвердить что ты не робот

Сравнение значений NaN для равенства в Javascript

Мне нужно сравнить два числовых значения для равенства в Javascript. Значения могут быть NaN. Я придумал этот код:

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

который работает нормально, но он выглядит раздутым. Я хотел бы сделать его более кратким. Любые идеи?

4b9b3361

Ответ 1

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

Ничего не улучшится. Просто добавьте круглые скобки, чтобы они поняли всем.

Ответ 2

Избегайте 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

Ответ 3

if ( val1 === val2 )

Если один или оба являются NaN, он будет оцениваться как false.

Кроме того, NaN !== NaN

Ответ 4

NaN никогда не совпадает с самим собой независимо от метода сравнения, поэтому единственным более сжатым решением для вашей проблемы, о котором я могу думать, было бы создание вызова функции с описательным именем для этого довольно специального сравнения и использования этого сравнения вместо этого в вашем коде.

Это также будет иметь преимущество локализации изменений алгоритма в тот день, когда вы решите, что undefined должен быть равен undefined.

Ответ 5

Пока вы знаете, что эти две переменные являются числовыми, вы можете попробовать:

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

Он превращает два значения в строки. Смешной ответ, но он должен работать.:)

Ответ 6

Попробуйте использовать 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.

Ответ 8

Для числовых случаев решение отлично, но для его расширения для работы с другими типами данных, мое предложение будет следующим:

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

Причина глобального isNaN ошибочна. Это даст вам неправильные результаты в таких сценариях, как

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

Я разместил здесь всеобъемлющий ответ, который также охватывает сравнение NaN для равенства.

Как проверить, является ли переменная JavaScript NaN

Ответ 9

Я создал этот ответ после рассмотрения предложений 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);
}

Ответ 10

Почему не утверждение if, подобное этому?

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

Ответ 11

Сравнение равенства с 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

Ответ 12

Нашел другой способ, используя Array.prototype.includes ссылка MDN. По-видимому, [NaN].includes(NaN) возвращает true для NaN.

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

Или мы можем пойти с решением davidchambers, которое намного проще.

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