추가로 배워야 하거나 정리할 내용들
- 블록 레벨 스코프와 함수 레벨 스코프
(2022-09-20에 추가됨)
- 모던 자바스크립트 Deep Dive의 프로토타입 파트까지 학습 후 프로토타입 기반 프로그래밍에 대한 설명글 작성
(2022-09-20에 추가됨)
'모던 자바스크립트 Deep Dive' 학습
8장 제어문
- 문의 종료에는 세미콜론을 붙이는 것이 일반적이지만, 불록문의 끝은 자체 종결성을 띄므로 세미콜론을 붙이지 않습니다.
9장 타입 변환과 단축 평가
- 자바스크립트에서는 기본적으로 엔진이 값을 평가해 타입을 유추하며, 이 과정에서 암묵적으로 타입을 변환하기도 합니다.
- 자바스크립트 엔진이 문자열 타입 아닌 값을 문자열 타입으로 암묵적 타입 변환하는 예제입니다.
0 + ''
-0 + ''
1 + ''
-1 + ''
NaN + ''
Infinity + ''
-Infinity + ''
true + ''
false + ''
null + ''
undefined + ''
(Symbol()) + ''
({}) + ''
Math + ''
[] + ''
[10, 20] + ''
(function(){}) + ''
Array + ''
- 숫자 타입 아닌 값을 숫자 타입으로 변환하는 예제입니다.
+''
+'0'
+'1'
+'string'
+true
+false
+undefined
+Symbol()
+{}
+[]
+[10, 20]
+(function(){})
- 불리언 타입 아닌 값을 불리언 타입으로 변환하는 경우 JS는 참/거짓을 Truthy, Falsy 값으로 구분하여 평가합니다. 특정 타입들은 Falsy 값이고 그 외에 값들은 모두 Truthy 값으로 판별하며, 그 예제는 아래와 같습니다.
function isFalsy(v) {
return !v;
}
function isTruthy(v) {
return !!v;
}
isFalsy(false);
isFalsy(undefined);
isFalsy(null);
isFalsy(0);
isFalsy(NaN);
isFalsy('');
isTruthy(true);
isTruthy('0');
isTruthy({});
isTruthy([]);
- 암묵적 타입 변환은 개발자 의도와 다르게 동작할 여지가 있으므로, 때로는 가독성을 위해 명시적으로 타입 변환을 해야 할 수 있습니다.
String(1);
String(NaN);
String(Infinity);
String(true);
String(false);
(1).toString();
(NaN).toString();
(Infinity).toString();
(true).toString();
(false).toString();
Number('0');
Number('-1');
Number('10.53');
Number(true)
Number(false)
parseInt('0');
parseInt('-1');
parseFloat('10.53');
Boolean('x');
Boolean('');
Boolean('false');
Boolean(0);
Boolean(1);
Boolean(NaN);
Boolean(Infinity);
Boolean(null);
Boolean(undefined);
Boolean({});
Boolean([]);
!!'x';
!!'';
!!'false';
!!0;
!!1;
!!NaN;
!!Infinity;
!!null;
!!undefined;
!!{};
!![];
- 논리합(
||
), 논리곱(&&
) 연산자는 논리 연산의 결과를 결정하는 피연산자를 타입 변환하지 않고 그대로 반환하며, 이 특성을 이용해 if문을 대체할 수 있습니다. 이를 단축평가라고 합니다.
var done = true;
var message = '';
if (done) message = '완료';
message = done && '완료';
console.log(message);
var done = false;
var message = '';
if (done) message = '미완료';
message = done || '미완료';
console.log(message);
- 단축 평가가 유용한 패턴을 살펴보며, 어떤 때에 이를 사용해야 하는지 예제와 함께 학습했습니다.
- 객체를 가리키기를 기대하는 변수가 null 또는 undefined가 아닌지 확인하고 프로퍼티를 참조할 때
var elem = null;
var value = elem.value;
var elem = null;
var value = elem && elem.value;
function weakGetStringLength(str) {
return str.length;
}
console.log(weakGetStringLength());
function getStringLength(str) {
str = str || '';
return str.length;
}
getStringLength();
getStringLength('hi');
function es6GetStringLength(str = '') {
return str.length;
}
es6GetStringLength();
es6GetStringLength('hi');
- 옵셔널 체인 연산자: ES11에 도입된 기능으로 연산자 ?.는 좌항의 피연산자가 null 또는 undefined인 경우 undefined를 반환하고, 그렇지 않으면 우항의 프로퍼티 참조를 이어갑니다.
var elem = null;
var value = elem?.value;
console.log(value);
var str = '';
var length = str && str.length;
console.log(length);
var length = str?.length;
console.log(length);
- null 병합 연산자: ES11에 도입된 기능으로 연산자 ??는 좌항의 피연산자가 null 또는 undefined인 경우 우항의 피연산자를 반환, 그렇지 않으면 좌항의 피연산자를 반환(변수에 기본값을 지정할 때 유용)합니다.
var foo = '' || 'default string';
console.log(foo);
var foo = '' ?? 'default string';
console.log(foo);
10장 객체 리터럴
- 자바스크립트는 객체 기반의 프로그래밍 언어로, 원시 값을 제외한 나머지 값 모두(함수, 배열, 정규 표현식 등)은 모두 객체입니다.
- 원시 값은 변경 불가능한 값이지만 객체 타입의 값은 변경 가능한 값이며, 자바스크립트에서 사용할 수 있는 모든 값은 프로퍼티 값이 될 수 있습니다.
따라서 자바스크립트의 함수도 일급 객체이기 때문에 값으로 취급할 수 있습니다.
- 책에서는 일급 객체에 대해 18장에서 추가로 다루며, 18.1절 도입부에 정의된 내용만 미리 참고했습니다.
- 다음 조건을 만족하는 객체를 일급 객체
라 함
1. 무명의 리터럴로 생성할 수 있다. 즉, 런타임에 생성이 가능하다.
2. 변수나 자료구조(객체, 배열 등)에 저장할 수 있다.
3. 함수의 매개변수에 전달할 수 있다.
4. 함수의 반환값으로 사용할 수 있다.
- 프로퍼티 값이 함수일 경우는 일반 함수와 구분 짓기 위해 메서드라 부릅니다.
- 객체 = 프로퍼티 + 메서드
- 프로퍼티: 객체의 상태를 나타내는 값
- 메서드: 프로퍼티(상태 데이터)를 참조하고 조작할 수 있는 동작(behavior)
- 자바스크립트는 프로토타입 기반 객체지향 언어로서 클래스 기반 객체지향 언어와 달리 다양한 객체 생성 방법을 지원합니다.
- 객체 리터럴
- Object 생성자 함수
- 생성자 함수
- Object.create 메서드
- 클래스(ES6부터 지원)
- 객체 리터럴의 중괄호는 코드 블록을 의미하지 않습니다. 즉 값으로 평가되는 표현식이며 닫는 중괄호 뒤에 세미콜론을 붙입니다.