Program Tip

Javascript에서 NaN 값이 같은지 비교

programtip 2020. 12. 8. 19:52
반응형

Javascript에서 NaN 값이 같은지 비교


Javascript에서 동일한 지 두 개의 숫자 값을 비교해야합니다. 값도있을 수 있습니다 NaN. 이 코드를 생각해 냈습니다.

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

잘 작동하지만 부풀어 보입니다. 좀 더 간결하게 만들고 싶습니다. 어떤 아이디어?


을 사용해보십시오.Object.is() 두 값이 동일한 값인지 확인합니다. 다음 중 하나가 유지되면 두 값이 동일합니다.

  • 양자 모두 undefined
  • 양자 모두 null
  • 둘 다 true또는 둘 다false
  • 동일한 순서로 동일한 문자를 가진 동일한 길이의 두 문자열
  • 둘 다 같은 개체
  • 숫자와
    • 양자 모두 +0
    • 양자 모두 -0
    • 양자 모두 NaN
    • 또는 둘 다 0이 아니고 NaN둘 다 동일한 값을 가짐

Object.is(NaN, NaN)=>true

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is참조하십시오.


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거짓으로 평가됩니다.

또한, NaN !== NaN


이 두 변수가 숫자라는 것을 알고있는 한 다음을 시도 할 수 있습니다.

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

두 값을 문자열로 바꿉니다. 재미있는 대답이지만 작동합니다. :)


NaN은 비교 방법에 관계없이 결코 그 자체와 동일하지 않으므로 내가 생각할 수있는 문제에 대한 더 간결한 해결책은이 다소 특별한 비교를 수행하기위한 설명적인 이름으로 함수 호출을 만들고 해당 비교 함수를 사용하는 것입니다. 대신 코드.

또한 undefined가 undefined와 같아야한다고 결정한 날 알고리즘에 대한 변경 사항을 지역화하는 이점이 있습니다.


숫자의 경우 솔루션은 좋지만 다른 데이터 유형에서도 작동하도록 확장하려면 다음과 같이 제안합니다.

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

글로벌 한 이유 isNaN는 잘못된 것입니다. 다음과 같은 시나리오에서 잘못된 결과를 제공합니다.

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

동등성에 대한 NaN 비교를 다루는 포괄적 인 답변을 여기에 게시했습니다.

JavaScript 변수가 있는지 테스트하는 방법 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


I created this answer after reviewing the suggestions of ThiefMaster, Esailija, Joachim Isaksson and davidchambers. Can this be further improved?

// 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);
}

Why not an if statement like this?

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

Equality comparison with NaN always results in False.

We can go for the javascript function isNaN() for checking equality with NaN. Example:

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);
    }
}

Results:

false ---- Values of 0

True ---- Values of 1


Found another way using Array.prototype.includes MDN link. Apparently, [NaN].includes(NaN) returns true for NaN.

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

Or we can go with davidchambers' solution which is much simpler.

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

참고URL : https://stackoverflow.com/questions/8965364/comparing-nan-values-for-equality-in-javascript

반응형