JS에서 == 과 ===

박정훈·2022년 1월 21일
0

Java Script

목록 보기
4/8
0 == "0" // true
0 == [] // true
"0" == [] // false ???

엘리스4기 과정을 밟던 중 막연하게 사용하던 == 과 === 의 차이에 대해 업급하길래... 순간 궁금해져서 찾아봤다.
개발자 글들을 보면 참 재밌는 밈들이 많던데 이것도 재밌었다.

숫자와 문자열끼리의 연산

다시 처음 봤던 예제 친구를 보면...
0 == "0"
'==' 타입은 값만을 비교한다. 그렇다면 0 과 "0"은 같은 값인가?
그렇다면 JS에서 타입변환은 숫자와 문자열을 비교할 때 어떻게 동작할까?

5 + "5" // '55'

숫자와 문자열을 더했더니 문자열 55가 나왔다. 그래서 다른 연산자도 해봤다.

5 - "5" // 0
5 * "5" // 25
"5" / 5 // 1
"5" % 5 // 0

얘네들은 또 숫자로 나왔다. 더하기는 문자열로 나왔었는데?
숫자와 문자열을 더한다는 개념은 모호하다. 물론 문자열에서도 더하기 연산이 가능하다. 아무튼... 그래서 둘 중 하나는 형이 바뀌어야 하는데, 문자열 'ㅇㄴ85%7@94%&ㅓㅏ' 같은 친구를 숫자로 바꿀수는 없다...😢. 그래서 숫자를 문자열로 바꿔서 계산해준다. 즉 덧셈문자열의 우선순위가 높다.

더하기를 제외한 연산자들을 무작위 문자열 '나ㅐㄹ%#(@)'에 사용 해 보면 모두 NaN이 출력되는 것을 볼 수 있다('11'-'1' 같은 경우에는 숫자가 나온다.). '나ㅐㄹ%#(@)' + '나ㅐㄹ%#(@)' 가 정상적으로 출력되는 것과는 사뭇 다르다. 숫자와 문자열을 -, *, /, %등과 같은 친구들로 연산하면 문자열이 숫자로 바뀌고 연산된다. 즉 덧셈을 제외한 연산자숫자가 우선순위가 높다.

그럼 []는 어떻게 설명하지?

여기까지로는 뭔가 궁금증이 다 해결된 거 같지는 않아서 더 찾아봤다. 배열은 원시값이 아닌 참조값으로 알고 있다. 참조값으로 물고 뜯고 한다고? 이게 가능한 이유는 연산시에 JS 엔진에 의해서 자동으로 참조값이 원시값으로 형변환이 이루어지기 때문이라고 한다.
[]는 [].tostring()을 통해서 ''로 바뀐다.

그럼 결과적으로

0 == "0" 이 값이 같다는 것은 숫자 0 으로 변환되면서 true가 나온다.
0 == [] 에서 빈배열 친구는 [].tostring()을 통해 ''로 바뀐다. 그리고 ''를 숫자로 형변환 하면 0 이니까 이 또한 true다.
"0" == [] 얘는 뭐 "0" 은 엄연히 0 이라는 문자열이다. [] 얘를 문자열로 바꿔봤자 '' 이기 때문에 false 아닐까?

그냥 급 궁금해져서 찾아봤는데... === 쓰면 될 거같다.

profile
그냥 개인적으로 공부한 글들에 불과

0개의 댓글