4.강제변환_5

악음·2021년 8월 12일
0

i will know javascript

목록 보기
12/12
post-thumbnail

4.5 느슨한/엄격한 동등비교

느슨한 동등 비교 == 엄격한 동등 비교
==는 강재변환을 허용하지만 ===는 강재변환을 허용하지 않는다

4.5.1 비교성능

느슨한 비교는 강재변환을 하기때문에 엄격한 비교에 비해서 성능이 떨어질수있지만
거의 차이가 없으므로 성능을 위해 편식을 하진 말자

4.5.2 추상 동등비교

느슨한 비교는 추상적 알고리즘에 의해 그 로직이 수행된다.

비교할 두값이 같은 타입이면 값을 식별하여 자연스럽게 견주어본다. 사소한 예외가 있으니 다음을 살펴보자

  • NaN은 그 자신과도 결코 동등하지 않다
  • +0과 -0은 동동하지 않다.

객체(함수 배열 포함)의 느슨한 동등 비교에 대해 두 객체가 정확히 똑같은 값에 대한 레퍼런스일 경우에만 동등하다고 기술되어 있다. 여기서 강제변환은 일어나지 않는다.

다른 값을 느슨한 비교로 견주어볼땐 두값의 타입을 일치시켜 간단히 값만 보고 비교한다.

숫자 == 문자

느슨한 비교의 대표적인 예는

let a = 41
let b = "41"
a==b //true
a===b //false

그렇다면 어떤 식으로 타입 변환이 일어날까?
왼쪽이 string으로? 오른족이 number로?

답은 어느 위치던 string이 number가 된다는것이다.
ES5 명세를 보면
x가 Number이고 y가 string 일떈 y가 number으로
x가 string이고 y가 number 일땐 x가 number으로 바뀐다

불리언 == 문자

그렇다면 불리언일땐 어떻게 될까?

불리언의 true는 1이고 false는 0이다

숫자와 비교중 피연산자중 불리언이 있다면
해당 값을 toNumber()를 통해 숫자화 시킨뒤 비교하게된다.

그렇다면 다음 코드를 보자

let a = "42"
let b = true
a==b // flase

"42"는 분명 boolean()으로 변환하면 true이지만
위에 식에선 false가 나온다 왜일까?

지금까지 배운것을 적용해보면
1. true가 toNumber가되어 1이된다
2. "42"== 1 인 상태에서 42 는 다시 toNumber()가 되어 42가된다
3 42==1 을 비교하면 false가 나온다.

때문에 이 경우 toBlooean은 개입하지 않는다.

때문에 ==true, ==false같은 동등식을 쓰지 말자.

null == undefined

x가 null이고 y가 undefined면 true을 반환
반대에 경우도 true을 반환

이경우 서로에게 타입을 맞춘다.

객체 == 비객체

객체 함수 배열 과 단순 스칼라 원시값의 비교는 다음과 같이 다룬다

객체를 toPrimitive()으로 변환하여 비교한다

let a = [42]
let b = 42 

a==b //true

여기서 a는 toPrimitive()을 통해 "42"가 반환되며 다시 toNumber()을 통해 42가 된다.

let a ="abc"
let b = new Object(a)
a==b // trye

이와같은경우에도 b를 toPrimitive 연산으로 "abc"라는 단순 스칼라 원시 값으로 강제 변환된다. 그런뒤 a값과 비교한다

다른 경우도 살펴보자

let a =null
let b =Object(a) // {}
let a =undefined
let b =Object(a) // {}

null과 undefined는 값이 없기 때문에 박싱되지않아 모두 빈 object를 반환한다 이런경우 서로 비교를 하면 false가 나온다.

NaN의 경우 숫자이기 때문에 ojbect(NaN)이될경우 Number(NaN)이되며 NaN과 비교하면 false가나온다(NaN은 자기자신과 비교하면 false가나온다)

profile
RN/react.js개발자이며 배운것들을 제가 보기위해서 정리하기 때문에 비속어 오타가 있을수있습니다.

0개의 댓글