자바스크립트의 4가지 같음(equality) 비교

4가지 같음(equality) 비교 방식

  • 느슨한 비교 (==)
  • 엄격한 비교 (===)
  • SameValueZero
  • SameValue

3가지 값 비교 연산자

  • ==
  • ===
  • Object.is

 

 

느슨한 비교 (==)

비교 대상인 양쪽을 정해진 규칙에 따라 공통의 타입으로 형 변환을 한 다음 비교합니다. 형 변환이 먼저 이루어진 후 실제 비교는 ‘엄격한 비교(===)’가 그대로 수행됩니다.

 

 

엄격한 비교 (===)

비교 대상인 양쪽에 절대 자동 형 변환이 발생하지 않습니다. 따라서, 타입이 서로 다른 경우 무조건 false를 반환하게 됩니다. 거의 모든 경우에 우리가 예측하는 것과 동일한 결과를 내겠지만, 아래의 두 가지만 예외적으로 다루게 됩니다.
  • NaN은 그 어떤 것과도 동일하지 않다고 여깁니다. (심지어 NaN 스스로와 비교할 때도)
  • +0과 -0을 같다고 여깁니다.
수학적으로 이슈가 되는 위 두 가지 경우를 제외하면, 일반적인 같음 비교는 엄격한 비교를 이용하면 되겠습니다.

SameValue

엄격한 비교(===)와 동일하지만, NaN과 NaN을 같게 +0과 -0을 서로 다르게 간주합니다. ECMAScript 2016에서 추가 된 Object.is가 이 알고리즘으로 구현되어 있습니다.

 

 

SameValueZero

엄격한 비교(===)와 동일하지만, NaN과 NaN을 같게 간주합니다. SameValue와는 달리+0과 -0을 서로 동일하게 간주합니다. 이 비교 알고리즘이 Map, Set 등의 데이터 구조에서 값이 같은지 비교하는데 가장 빈번하게 사용됩니다.

Inside Lodash: _.difference

 

_.difference(array, [values])

 

첫 번째로 주어지는 배열에서 후속 배열들을 빼줍니다. 장바구니에서 선택한 상품들을 제거하거나 전체 유저에서 특정 집단의 유저들을 빼는 등 의외로 쓰임새가 많은 함수입니다.

 


var _ = require('lodash');

const users = [ 'Amy', 'Baker', 'Charles', 'Dave', 'Judy', 'Loren', 'Mickey', 'Todd' ];
const teamA = [ 'Baker', 'Mickey' ];
const teamB = [ 'Dave', 'Mickey', 'Todd' ];
const noTeam = _.difference(users, teamA, teamB);
console.log(noTeam);

=> [ 'Amy', 'Charles', 'Judy', 'Loren' ]

 

마치 배열 빼기 배열 즉, ‘배열 – 배열’ 처럼 이해하면 쉽습니다.

한편, _.pullAll 함수도 비슷한 기능을 제공합니다. 하지만 difference 함수는 빼고 남은 값들로 새로운 배열을 만들어 반환하는 반면 pullAll 함수는넘어온 배열 자체를 변경시킵니다.

이 함수에서 배열의 값들이 서로 같은지(equality) 여부를 결정하는 알고리즘은 ‘SameValueZero’ 입니다. 이 알고리즘은 NaN과 +0, -0에 대한 이슈를 제외하면 === 연산자와 거의 동일하게 동작합니다. 자바스크립트에서 값의 비교를 위한 알고리즘은 여러가지가 있는데 다음 문서를 참고하시면 이해하시는데 도움이 되겠습니다.

Equality comparisons and sameness