: 부수 효과가 명확하지 않게 숨겨진 형태로 일어나는 타입변환
📍 불필요한 상세 구현 줄이는게 목표
임의의 타입 → Sometype 타입 변환
⚠️ 명시적 강제변환이 물론 좋지만 무조건적으로 암시적 강제변환이 나쁜건 아니다.
🔹 + 연산자 : 숫자의 덧셈 or 문자열 접합으로 오버로드 → 어떻게 두개의 연산을 구분?
a + ""
: 숫자를 문자열로 강제 변환하는 관용코드 (암시적 강제변환임)🔹 - 연산자 : 숫자 뺄셈 기능이 전부
a - 0
: a 값을 숫자로 강제변환👍 복잡한 형태의 불리언 로직을 숫자 덧셈 형태로 단순화 할 때 편리함
🔹 !!arguments[i]
: true/false로 강제 변환
🔹 if ()
문의 조건 표현식
🔹 for ( ; ; )
에서 두 번째 조건 표현식
🔹 while ()
및 do ... while()
루프의 조건 표현식
🔹 ? :
상항 연산 시 첫 번째 조건 표현식
🔹 ||
및 &&
의 좌측 피연산자
📍 콘텍스트에서 불리언이 아닌 값이 사용되면 일단 불리언 값으로 암시적 강제변환 됨.
&&
와 ||
연산자💡 자바스크립트에서 두 연산자는 다른 언어와 달리 실제로 결괏값이 논리 값이 아님!!
⇒ &&
또는 ||
연산자의 결괏값이 반드시 불리언 타입이어야 하는 것은 아니며 항상 두 피연산자 표현식 중 어느 한쪽 값으로 귀결됨
a || b;
a ? a : b; //위와 같은 코드
a && b;
a ? b : a; //위와 같은 코드
⚠️ " "
값은 falsy값임
🔹 ||
연산자
🔹 &&
연산자
📍 복합 논리 표현식의 작동 방식
: 심벌 -> 문자열
명시정 강제변환은 👌, 암시적 강제변환은 ❌
🖐️ BUT! 불리언 값으로는 명시적/암시적 모두 강제변환 가능
🔹 느슨한 동등 비교 : ==
➡️ 강제변환 ⭕
🔹 엄격한 동등 비교 : ===
➡️ 강제변환 ❌
📌 강제 변환이 필요하다면 ==
필요하지 않다면 ===
사용
: ==
연산자 로직은 추상적 동등 비교 알고리즘
📍 객체의 느슨한 동등 비의 경우 정확히 똑같은 값에 대한 레퍼런스일 경우에만 동등 ➡️ 강제변환 일어나지 않음!
var a = 42;
var b = "42";
a === b; // false
a == b; // true
🔹 ===
는 강제 변환이 안되므로 false
🔹 ==
는 피연산자의 타입이 다르면 비교알고리즘에 의해 피연산자 값이 암시적으로 강제변환되어 true
var x = true;
var y = "42";
x == y; //false
📍 == true
or == false
와 같은 코드는 안쓰는 것이 좋음
===
는 괜찮아요!
🔹 null과 undefined를 느슨한 동등 비교하면 강제변환
🔹 이 강제변환은 안전하고 예측 가능하며, 어떤 다른 값도 비교 결과 긍정 오류를 할 가능성이 없음
var a = "abc";
var b = Object( a );
a === b; //false
a == b; //true
var x = null;
var y = Object( x );
x == y; // false
var c = undefined;
var d = Object( c );
c == d; //false
var e = NaN;
var f = Object( e );
e == f; //false
NaN == NaN
이 되어 false가 됨"0" == false; //true
false == 0; //true
false == ""; //true
false == []; //true
"" == 0; //true
"" == []; //true
0 == []; //true
➡️ 긍정 오류
[] == ![] //true
2 == [2]; //true
"" == [null]; //true
0 == "\n"; //true
: a < b 비교 과정
🔹 피연산자 모두 문자열일 때
🔹 그 외의 경우
📍 자바스크립트 엔진은 <=
를 '더 크지 않은'(!(a > b) → !(b < a)
)의 의미로 해석