if (
!!this.obj.country.code &&
!!this.obj.port.code &&
!!this.obj.type.value
) {
!
는 논리 부정 연산자로, 값을 부정합니다. 값이falsy
인 경우(null
,undefined
,false
,0
,NaN
,''
)에true
를 반환하고, 그 외의 경우에는false
를 반환합니다.- 두 번 연속으로
!
를 사용하면 해당 값을 부정한 뒤 다시 부정하여 원래의 값을 얻습니다. 이렇게 하면 값이 존재하는 경우true
를 반환하고, 그렇지 않은 경우false
를 반환합니다.
! 같은 경우에는 체크하려는 값이 falsy인경우에는 true이고
!! 같은 경우에는 체크하려는 값이 true인경우 true이다.
쉽게 설명하여 !의 반대로 생각하고 있는데요.
그렇다면 결론적으로는
obj.country.code &&
obj.port.code &&
obj.type.value 값들이 전부 true이면 값을 적용시킨다는 말인데 말이죠.
그렇다면 그냥
if (
this.obj.country.code &&
this.obj.port.code &&
this.obj.type.value
) {
이렇게 조건을 걸어도 되는거 아닌가요..?
!!로 체크하는 경우는 주로 어떠한경우에 쓰일까요?
이쪽이 워낙 엉망이라 저도 정확히는 모르지만, 대표적인 예시로 빈 배열이 있습니다...ㅋㅋ
([] == false) → true 이지만, !![] 는 true 라서
(!![] == false) → false
입니다.
!!this.obj.country.code &&
!!this.obj.port.code &&
!!this.obj.type.value
해당 코드를 불리언타입으로 형변환해서 불리언타입의 조건으로만 true, false를 보겠다는 말이군요..
명확하게 묵시적 형변환 자체를 아예 코드상에서 허용하지 않는 정책으로 개발하는 환경도 꽤 많습니다.
그럴때 가장 편하게 형변환 할 수 있는 방법중 하나죠.
명시적이 아닌,
암시적? 묵시적 형변환은 혹시 실무에서도 자주 쓰이는편일까요?
!! 으로 변환한건 명시적 형변환에 속하지 않을까요?
boolean 으로 변환하려는 개발자의 의도가 명확하니까요.
해당 블로그의 설명글을 보면 !!은 명시적은 아니라고 나와있드라구요.