==을 이야기하려면 글을 몇개를 작성해도 끝이 없을 것 같다. 그 만큼 사용하기 까다로우며, 몇 가지 규칙들은 꽤나 많은 ===을 대신 할 수 있는 장점이 있다.
간단하게 null을 이용한, undefined, null 체크가 있다.
if( null == null && null == undefined ) {
console.log('A == null 은 null과 undefined를 체크 할 수 있습니다.')
}
위의 코드를 ===를 이용하여 체크하려면,
if( null === null || undefined === undefined ) {
console.log('A === null은 null만 체크가능 하여, undefined를 체크 하기 위해서는 길이가 길어집니다.')
}
하지만 ==는 아래와 같은 문제점이 있다.
if( [] == false ) {
console.log('[]는 false입니다.')
}
if( [] == 0 ) {
console.log('[]는 0입니다.')
}
if( [] == '0' ) {
console.log('[]는 \'0\'이 아닙니다.')
}
if( 0 == '0' ) {
console.log('0은 \'0\'입니다.')
}
[] == 0이고, 0 == '0'이지만, [] == '0'이 아니게 된다.
삼단논법이 박살나는 순간이다.
참고로 []는 ''이다....
if( [] == '' ) {
console.log('[]는 \'\'입니다.')
}
자 그러면, 왜 []는 ''인지 생각을 해볼 필요가 있습니다.
객체와 원시타입을 비교를 진행하게 되면, 객체를 원시타입으로 변환하여, 비교를 진행 하게 됩니다. 간단하게 Symbol.toPrimitive를 사용하여 간단하게 구현 해볼 수 있습니다.
const a = {
[Symbol.toPrimitive](type) {
if(type === 'default') return '10000'
if(type === 'number') return 123
if(type === 'string') return 'string'
}
}
if( a == '10000' && a == 10000 ) console.log('default로 값을 체크 합니다.')
if( a == '123' || a == 123 || a == 'string' ) console.log('default로 값을 체크 합니다.')
자 하지만 문제는 [], {}는 [Symbol.toPrimitive]가 존재 하지 않습니다.
자 그러면 왜 []는 ''일까?
결론적으로 말하면, toString때문입니다.
if( [] == '' && [1] == '1' && [1, 2] == '1,2' ) {
console.log('기본적인 비교')
}
if( [].toString() == '' && [1].toString() == '1' && [1, 2].toString() == '1,2' ) {
console.log('toString으로 비교')
}
자 여기서 보면, join함수를 실행한 것이 너무너무 join의 실행과 유사해보입니다.
기본적인 {}의 toString은 그냥 아래와 같이 별 의미가 없습니다.
값이 있다고 하더라도, 별 의미는 없습니다. 하지만, 배열의 경우 달라지는 것이죠.
class TestArray extends Array {
join() {
return 'TestArray join called'
}
}
class NormalArray extends Array {
}
const tArr = new TestArray([1, 2, 3, 4])
const NormArray = new NormalArray([1, 2, 3, 4])
console.log(tArr.toString()) // TestArray join called
console.log(NormArray.toString()) // 1,2,3,4
하지만 배열의 경우, toString이 join함수를 실행을 하게 됩니다.
자 이제 이 답변을 할 차례가 되었습니다.
if( [] == '' ) { // 1
console.log('[]은 \'\'입니다.')
}
if( [] == 0 ) { // 2
console.log('[]은 0입니다.')
}
if( [] == false ) { // 3
console.log('[]은 false입니다.')
}
if( [] == '0' ) { // 4
console.log('[]는 \'0\'이 아닙니다.')
}
1번의 경우 []의 toString을 통하여, join이 호출 되었습니다. [].join() == ''로 비교 됩니다.
2번은 '' == 0의 비교가 숫자 비교가 발생하기 때문에 문자열을 숫자로 변환 합니다.
Number('') == 0입니다.
3번은 '' == false의 비교가 불리언 비교가 발생하기 때문에 문자열은 불리언으로 변환합니다.
Boolean('') == false
4번은 [].join() == '0'으로 비교가 됩니다.
'' == '0' false여야 합니다.
댓글
댓글 쓰기