You Don't Know JS 책을 읽고 만든 문제들을 공유합니다.
문제와 해설은 직접 작성하였으며 문제는 github에, 해설은 velog에 업로드합니다.
틀린 부분이 있을 수 있으니 언제든지 지적해 주세요.
변수에 적절한 타입의 값이 할당되지 않았을 때 prototype을 이용해 빈 함수 또는 빈 배열 등의 값으로 초기화할 수 있습니다.
prototype을 사용하지 않고 function() {}, [] 등의 값으로 초기화하게 되면 함수 호출 시마다 디폴트 값을 생성하지만 prototype은 생성되어 내장된 상태이기 때문에 한 번만 생성되어 메모리 낭비를 줄일 수 있습니다.
+ 연산자는 문자열 붙이기와 숫자 더하기 연산의 두 가지 목적으로 사용할 수 있습니다.
한쪽 피연산자가 문자열이거나 문자열 표현형으로 나타낼 수 있을 경우 문자열 붙이기 연산을 합니다.
예를 들어 객체는 문자열 표현형으로 나타낼 수 있으므로 객체와의 + 연산은 문자열 붙이기 연산이 됩니다.
const a = [1];
const b = [2];
const c = a + b;
console.log(c); // "12"
console.log(typeof c); // "string"
- 연산자는 +와 달리 숫자 뺄셈 연산만 존재합니다.
따라서 문자열 표현형으로 나타낼 수 있을 경우 문자열로 강제 변환한 뒤 이를 또 숫자로 강제변환하여 숫자 뺄셈 연산을 진행합니다.
const a = [1];
const b = [2];
const c = a - b;
console.log(c); // -1
console.log(typeof c); // "number"
const a = 42;
const b = null;
const c = "";
console.log(a && b && c);
출력될 값은 null 입니다.
&& 연산자는 첫 번째 피연산자의 평가 결과가 truthy일 때에만 두 번째 피연산자를 선택합니다.
따라서 42 && null
은 42가 truthy이므로 평가 결과가 null이 됩니다.
또 null && ""
은 null이 falsy이므로 평가 결과가 null이 됩니다.
falsy값
undefined, null, +0, -0, NaN, false, ""
truthy 값
falsy가 아닌 값들
계산 결과는 true입니다.
느슨한 동등비교에서 두 피연산자가 비 불리언과 불리언일 경우 불리언이 숫자로 강제 변환됩니다.
따라서 "" == false
의 식은 다음의 계산 과정을 거칩니다.
"" == 0 // 1. false가 숫자 0으로 강제 변환
0 == 0 // 2. 문자열 ""이 숫자 0으로 강제 변환
true
const a = b = ["13"];
console.log(["13"] == ["13"]);
console.log(a == b);
출력될 값은 false, true 입니다.
느슨한 동등비교 연산 시 두 피연산자가 모두 객체일 경우 두 피연산자가 동일한 객체를 참조할 때에만 평가 결과가 true가 됩니다.
따라서 첫 번째 콘솔 로그의 경우에는 두 피연산자가 동일한 객체를 참조하지 않기 때문에 평가 결과가 false이고 두 번째 콘솔 로그의 경우 두 피연산자가 동일한 객체를 참조하고 있기 때문에 평가 결과가 true입니다.
보통 느슨한 동등비교 시 강제 변환을 통해 식이 평가되지만 객체 간의 동등 비교 시에는 강제 변환이 일어나지 않습니다.