이 비교를 사용하는 코드 예제를 우연히 발견했습니다.
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.is
ECMAScript 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)
거짓입니다
자바 스크립트는 적어도 네 종류의 “평등”을 가지고 있습니다 :
==
피연산자가 일치하도록 “느슨하게”( ). 규칙은 명확 하지만 명확 하지는 않습니다. ("" == 0
istrue
;"true" == true
isfalse
, …)입니다.===
다른 유형의 피연산자가 강제되지 않고 같지 않은 “엄격한”( )이지만 위의 참고NaN
및 양수 및 음수 0을 참조하십시오 .- SameValue-위에 나열된대로 (에서 사용
Object.is
) - SameValueZero-를
SameValue
제외+0
하고-0
는 같지만 다르지 않고 동일합니다 (Map
키에 의해 사용됨Array.prototype.includes
).
언어 또는 런타임 자체에서 제공되지 않지만 일반적으로 다음과 같이 표현되는 객체 동등성 도 있습니다 . ).
- 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를 반환하십시오.
- Type (x)가 Type (y)와 다른 경우 false를 반환합니다.
- Type (x)가 숫자이면
- x가 NaN이면 false를 반환합니다.
- y가 NaN이면 false를 반환합니다.
- x가 y와 같은 숫자 값이면 true를 반환합니다.
- x가 +0이고 y가 -0이면 true를 반환합니다.
- x가 -0이고 y가 +0이면 true를 반환합니다.
- 거짓을 돌려줍니다.
- 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
똑같은 것을 고려할 때보 다 올바르게 작동 하는 경우.