JavaScript

[JavaScript] == (느슨한 비교) 와 === (엄격한 비교)

댕주 2024. 11. 9. 22:22

JavaScript에서는 두 가지 비교 방식이 있다.

==느슨한 비교 (loose equality)라고 불리며, ===엄격한 비교 (strict equality)라고 한다.

 

1. == 느슨한 비교

  • 타입 변환을 수행한 후 값이 같은지 비교한다
  • JavaScript는 == 를 사용할 때, 비교 대상의 타입이 다르면 암묵적 형 변환을 통해 타입을 맞추려고 시도한다.
  • 예상치 못한 결과를 초래할 수 있으므로 주의가 필요하다
  • 예시:
5 == "5" // true - "5"가 숫자 5로 변환되어 비교
false == 0 // true - false가 0으로 변환되어 비교
null == undefined // true - 둘 다 비어 있는 값으로 간주
[] == false // true - 빈 배열이 falsy로 평가

 

2. === 엄격한 비교

  • 타입과 값이 모두 같아야 true 를 반환한다
  • 암묵적 형 변환을 하지 않으며, 타입이 다르면 무조건 false 를 반환하므로 예측 가능한 결과를 제공한다.
  • 예시:
5 === "5" // false
false === 0 // false
null === undefined // false
[] === false // false

 

3. ===== 비교의 주의사항

  • 예측 가능성: == 는 타입 변환이 개입되어 종종 예상치 못한 결과를 초래할 수 있다. 때문에, 대부분의 경우 === 가 더 안전하고 권장된다.
  • 특정 상황에서 == 사용 가능: nullundefined 를 느슨하게 비교할 때, 두 값이 모두 "존재하지 않음"을 나타내므로 null == undefined 를 허용하는 경우 유용할 수 있다.
const value = null
value == undefined // true
value === undefined // false

 


빈 배열이 == 비교에서 false로 평가되는 이유

== (느슨한 비교) 에서는 JavaScript가 서로 다른 타입의 값을 비교할 때 양쪽 값을 같은 타입으로 변환하려고 시도한다. 빈 배열과 false를 비교할 때, JavaScript는 아래와 같은 변환 규칙을 따른다

 

1. 배열과 불리언의 비교

  • == 을 사용할 때, 한쪽 값이 불리언(true 또는 false)이고 다른 쪽이 객체(여기서는 배열)일 경우,
    JavaScript는 객체를 먼저 원시 값으로 변환한다.

2. 배열의 원시 값 변환

  • 배열을 원시 값으로 변환할 때 JavaScript는 배열을 문자열로 변환한다. 빈 배열 [] 은 문자열로 변환되면 "" (빈 문자열)가 된다
[] == "" // true - 빈 배열이 빈 문자열로 변환된다

 

3. 빈 문자열과 false 의 비교

  • 이제 남은 비교는 "" == false 이다
  • false 는 숫자 0 으로 변환되고, "" 는 숫자 0 으로 변환된다.
  • 0 == 0 이 되어 true 를 반환한다
"" == false // true - 빈 문자열과 false가 0으로 변환되어 같음
[] == false // true - 결국 [] == "" == 0 == false

 

이와 같은 변환 과정을 거치면서 빈 배열은 false 로 평가된다

[] === false // false - 타입이 다르므로 비교하지 않는다

 

결론적으로, 빈 배열 자체는 Truthy이지만, == 를 사용한 비교 과정에서 암묵적 변환이 일어나면서 false 와 같아지는 것이다.