김 양의 멋따라 개발따기

JavaScript !! (느낌표 두 개) 완전 정리: 왜 쓰고, 언제 위험할까? 본문

TIL

JavaScript !! (느낌표 두 개) 완전 정리: 왜 쓰고, 언제 위험할까?

개발따라김양 2026. 1. 19. 12:53

1) !와 !!의 의미

!value : 부정(논리 NOT)

  • value를 truthy/falsy로 평가한 뒤 결과를 뒤집는다.
  • 결과 타입은 항상 boolean이다.
 
 

!!value : boolean으로 강제 변환(정규화)

  • !를 두 번 적용해서 뒤집고 다시 뒤집음 → “참/거짓 여부만” 남긴다.
  • 결과는 무조건 true 또는 false.
 

2) truthy / falsy 한 번에 정리

JS에서 조건문은 boolean이 아니어도 동작하고, 값은 크게 두 종류로 평가된다.

falsy (조건문에서 false 취급)

  • false
  • 0, -0
  • 0n (BigInt)
  • "" (빈 문자열)
  • null
  • undefined
  • NaN

truthy (그 외 전부 true 취급)

  • "0" (문자열)
  • "false" (문자열)
  • [] (빈 배열)
  • {} (빈 객체)
  • function() {} 등…

포인트: 빈 배열/빈 객체도 truthy

3) !!를 쓰는 이유 (장점)

1) 타입을 boolean으로 “고정”

설정값이 1, "Y", 객체 같은 형태로 들어올 수 있을 때도
한 번 !!로 플래그 형태(booleans)로 정규화할 수 있다.

2) 조건문/비교에서 실수 줄이기

아래처럼 엄격 비교를 하거나, 다른 함수에 넘길 때도 안정적이다.

3) “없으면 false” 기본값 처리

값이 없으면 undefined → !!undefined는 false라서
기본 OFF 동작을 쉽게 만든다.

 

4) BUT: !!가 “정확한 의미”를 보장하진 않는다 (주의)

!!는 값의 의미를 해석하지 않고, JS의 truthy/falsy 규칙만 적용한다.

✅ 결론:

  • !!는 타입 일관성에는 도움
  • 하지만 "false", "0" 같은 값이 들어오면 의도와 다른 결과가 될 수 있음

5) 한 줄 요약

  • !!value는 값을 boolean(true/false)로 강제 변환한다.
  • 조건문에서 타입 혼란을 줄여주는 장점이 있다.
  • 하지만 "false" 같은 문자열은 truthy라서 의도와 다른 결과가 날 수 있어,
    입력이 문자열일 가능성이 있으면 명시적으로 파싱하자.