[javascript] Object.is vs ===

이 비교를 사용하는 코드 예제를 우연히 발견했습니다.

var someVar = 0;
Object.is(false, someVar); //Returns false 

알 수 false == 0있을 것입니다 true우리가 가지고있는 이유의 ===.

Object.is와는 어떻게 다른 ===가요?



답변

===JavaScript에서는 엄격한 비교 연산자라고합니다. Object.is엄격한 비교 연산자는 정확히 제외하고 같은 행동을 NaN하고 +0/-0.

MDN에서 :

Object.is()방법은 ===연산자 에 따라 동일하지 않습니다 . ===연산자 (그리고 ==물론 오퍼레이터)는 숫자 값과 동일 -0 +0로서 취급하고 처리 Number.NaN와 동일하지 NaN.

코드는 아래의 차이 강조 ===Object.is().

console.log(+0 === -0); //true
console.log(Object.is(+0, -0)); //false

console.log(NaN === NaN); // false
console.log(Object.is(NaN, NaN)); //true

console.log(Number.NaN === Number.NaN); // false
console.log(Object.is(Number.NaN, Number.NaN)); // true

console.log(NaN === Number.NaN); // false
console.log(Object.is(NaN, Number.NaN)); // true

여기에 이미지 설명을 입력하십시오

여기에서 더 많은 예제를 찾을 수 있습니다 .

참고 : Object.isECMAScript 6 제안의 일부이며 아직 광범위하게 지원되지 않습니다 (예 : Internet Explorer 버전 또는 기타 이전 버전의 다른 브라우저에서는 지원되지 않음). 그러나 ES6 이외의 브라우저에는 위의 링크에서 찾을 수있는 폴리 필을 사용할 수 있습니다.


답변

Object.is사양의 사용 SameValue 알고리즘 , 반면에 ===사용하는 엄격한 평등 알고리즘 . 엄격한 평등 알고리즘에 대한 메모는 다음과 같은 차이점을 지적합니다.

이 알고리즘은 부호있는 0과 NaN 처리에서 SameValue 알고리즘과 다릅니다.

참고 :

  • NaN === NaN거짓이지만 Object.is(NaN, NaN)사실이다
  • +0 === -0사실이지만 Object.is(+0, -0)거짓입니다
  • -0 === +0사실이지만 Object.is(-0, +0)거짓입니다

자바 스크립트는 적어도 네 종류의 “평등”을 가지고 있습니다 :

  • ==피연산자가 일치하도록 “느슨하게”( ). 규칙은 명확 하지만 명확 하지는 않습니다. ( "" == 0is true; "true" == trueis false, …)입니다.
  • ===다른 유형의 피연산자가 강제되지 않고 같지 않은 “엄격한”( )이지만 위의 참고 NaN및 양수 및 음수 0을 참조하십시오 .
  • SameValue-위에 나열된대로 (에서 사용 Object.is)
  • SameValueZero-를 SameValue제외 +0하고 -0는 같지만 다르지 않고 동일합니다 ( Map키에 의해 사용됨 Array.prototype.includes).

언어 또는 런타임 자체에서 제공되지 않지만 일반적으로 다음과 같이 표현되는 객체 동등성 도 있습니다 . ).


SameValue 알고리즘 :

  • Type (x)가 Type (y)와 다른 경우 false를 반환합니다.
  • Type (x)가 숫자이면
    • x가 NaN이고 y가 NaN이면 true를 반환합니다.
    • x가 +0이고 y가 -0이면 false를 반환합니다.
    • x가 -0이고 y가 +0이면 false를 반환합니다.
    • x가 y와 같은 숫자 값이면 true를 반환합니다.
    • 거짓을 돌려줍니다.
  • SameValueNonNumber (x, y)를 반환합니다.

… 여기서 SameValueNonNumber 는 다음과 같습니다.

  • 주장 : 유형 (x)는 숫자가 아닙니다.
  • Assert : Type (x)는 Type (y)와 같습니다.
  • Type (x)가 Undefined이면 true를 반환합니다.
  • Type (x)가 Null이면 true를 반환합니다.
  • Type (x)가 문자열이면
    • x와 y가 정확히 동일한 코드 단위 시퀀스 (해당 색인에서 동일한 길이와 동일한 코드 단위)이면 true를 리턴합니다. 그렇지 않으면 false를 반환합니다.
  • Type (x)가 부울 인 경우
    • x와 y가 모두 true이거나 모두 false이면 true를 반환합니다. 그렇지 않으면 false를 반환합니다.
  • Type (x)가 Symbol이면
    • x와 y가 모두 동일한 Symbol 값이면 true를 반환합니다. 그렇지 않으면 false를 반환합니다.
  • x와 y가 동일한 Object 값이면 true를 반환합니다. 그렇지 않으면 false를 반환하십시오.

엄격한 평등 알고리즘 :

  1. Type (x)가 Type (y)와 다른 경우 false를 반환합니다.
  2. Type (x)가 숫자이면
    • x가 NaN이면 false를 반환합니다.
    • y가 NaN이면 false를 반환합니다.
    • x가 y와 같은 숫자 값이면 true를 반환합니다.
    • x가 +0이고 y가 -0이면 true를 반환합니다.
    • x가 -0이고 y가 +0이면 true를 반환합니다.
    • 거짓을 돌려줍니다.
  3. SameValueNonNumber (x, y)를 반환합니다.

답변

Object.is = function(v1, v2){
  //test for `-0`
  if(v1 === 0 && v2 === 0) {
    return 1 / v1 === 1 / v2;
  }

  //test for `NaN`
  if(v1 !== v1) {
    return v2 !== v2;
  }

  //everything else
  return v1 === v2;
}

위의 내용은 Object.is알고 싶은 사람에게 어떻게 작동 하는지 보여주는 polyfill 함수 입니다. You-Don’t-Know-JS에 대한 참조


답변

요약:

Object.is()함수는 2 개의 값을 인수로 사용하고 지정된 2 개의 값이 정확히 동일한 경우 true를 반환하고, 그렇지 않으면 false를 반환합니다.

왜 이것이 필요한가요?

우리는 이미 ===연산자 와 자바 스크립트에서 엄격한 평등 (유형 + 값 검사) 검사를하고 있다고 생각할 수 있습니다. 이 기능이 왜 필요한가요? 어떤 경우에는 엄격한 평등이 충분하지 않으며 다음과 같습니다.

console.log(NaN === NaN);   // false
console.log(-0 === +0);     // true

Object.is() 이러한 값을 비교하여 엄격한 평등 연산자가 할 수없는 유사한 값인지 확인할 수 있습니다.

console.log(Object.is(NaN, NaN));  // true
console.log(Object.is(-0, 0));     // false
console.log(Object.is(+0, +0));    // true
console.log(Object.is(+0, -0));    // false


답변

간단히 말해서, 그것들은 비슷하지만 Object.is더 똑똑하고 정확합니다 …

이것을 보자 …

+0 === -0 //true

그러나 이것은 무시 -하고 +전에는 완전히 옳지 않습니다 …

이제 우리는 다음을 사용합니다.

Object.is(+0, -0) //false

보다시피, 비교하기가 더 정확합니다.

또한 NaN그것이 NaN똑같은 것을 고려할 때보 다 올바르게 작동 하는 경우.


답변