모던 자바스크립트 Deep Dive 1
Modern JavaScript Deep Dive 1~10
1장 프로그래밍
프로그래밍은 요구사항의 집합을 분석해서 적절한 자료구조와 함수의 집합으로 변환한 수, 그 흐름을 제어하는 것
프로그래밍이란?
정확하고 상세하게 요구사항을 설명하는 작업이며 그 결과물이 바로 코드
컴퓨터 관점에서 문제를 사고해야하며 여기에는 논리적, 수학적 사고가 필요
해결 과제를 작은 단위로 분해하고 패턴화해서 추출하며 프로그래밍 내에서 사용될 모든 개념은 평가 가능하도록 정의 해야함
프로그래밍 언어
기계어로 직접 명령을 전달하는 것을 대신할 가장 유용한 대안 => 사람이 이해할 수 있는 약속된 구문(syntax)으로 구성된 프로그래밍 언어를 사용해 프로그램을 작성한 후, 컴퓨터가 이해할 수 있는 기계어로 변환하는 일정의 번역기를 이용하는 것
컴파일러compiler or 인터프리터interpreter
프로그래밍 언어 = 구문(syntax) + 의미(semantics)
구문과 의미
문법(syntax)에 맞는 문장을 구성하는 것은 물론 의미(semantics) 를 가지고 있어야 언어의 역할을 충실히 수행할 수 있음
요구사항이 실현(문제가 해결)되어야 의미가 있음
문제 => (문제 해결 능력) => 해결방안 => (문법/의미) => 코드
프로그래밍의 목적은 문제 해결
2장 자바스크립트란?
... 이제 자바스크립트는 크로스 플랫폼을 위한 가장 중요한 언어로 주목받고 있음 ...
자바스크립트의 탄생
넷스케이프 커뮤니케이션즈에서 웹페이지의 보조적인 기능을 수행하기 위해 브라우저에서 동작하는 경량 프로그래밍 언어를 도입 => 브렌던 아이크가 개발한 자바스크립트
자바스크립트의 표준화
자바스크립트의 파생 버전인 JScript와의 크로스 브라우징 이슈로 인해 표준화된 자바스크립트의 필요성이 대두
ECMA 인터내셔널에 자바스크립트의 표준화를 요청 => ECMAScript로 명명
자바스크립트 성장의 역사
초창기 자바스크립트
웹페이지의 보조적인 기능을 수행하기 위한 한정적인 용도로 사용
서버로부터 전달받은 HTML과 CSS를 단순 렌더링 하는 수준
Ajax
자바스크립트를 이용해 서버와 브라우저가 비동기방식으로 데이터를 교환할 수 있는 통신 기능인 Ajax(Asynchronous JavaScript and XML)가 XMLHttpRequest라는 이름으로 등장
웹페이지에서 변경할 필요가 없는 부분은 다시 렌더링하지 않고 서버로 부터 필요한 데이터만 전송받아 변경해야 하는 부분만 한정적으로 렌더링하는 방식
jQuery
DOM(Document Object Model)을 더욱 쉽게 제어할 수 있게 되었고 크로스 브라우징 이슈도 어느정도 해결
V8 자바스크립트 엔진
V8 엔진의 등장으로 데스크톱 애플리케이션과 유사한 사용자 경험(UX)을 제공할 수 있는 웹 애플리케이션 프로그래밍 언어로 정착
과거 웹 서버에서 수행되던 로직들이 대거 클라이언트(브라우저)로 이동, 프런트엔드 영역이 주목받는 계기로 작용
Node.js
V8 자바스크립트 엔진으로 빌드된 자바스크립트 런타임 환경
자바스크립트 엔진을 브라우저에서 독립시긴 자바스크립트 실행 환경
비동기I/O를 지원하며 단일 스레드 이벤트 루프 기반으로 동작함으로써 요청 처리 성능이 좋음
데이터를 실시간으로 처리하기 위해 I/O가 빈번하게 발생하는 SPA에 적합
브라우저를 벗어나 서버 사이드 애플리케이션 개발에서도 사용할 수 있는 범용 프로그래밍 언어가 됨
SAP 프레임워크
모던 웹 어플리케이션은 데스크톱 애플리케이션과 비교해도 손색없는 성능과 사용자 경험을 제공하는 것이 필수가 되었고 개발 규모와 복잡도도 상승
따라서 CBD(Component based developmet) 방법론을 기반으로하는 SPA가 대중화 되면서 React, Vue.js, Angular, Svelte 등 등장
자바스크립트와 ECMAScript
자바스크립트는 일반적으로 프로그래밍 언어로서 기본 뼈대(core)를 이루는 ECMAScript와 브라우저가 별도로 지원하는 클라이언트 사이드 Web API(DOM, BOM, Canvas, XMLHttpRequest, fetch, requestAnimationFrame, SVG, Web Storage, Web Component, Web Worker)를 아우르는 개념
자바스크립트는 일반적으로 ECMAScript를 아우르는 개념
클라이언트 사이드 Web API는 웹 콘소시엄에서 별도의 사양으로 관리
자바스크립트의 특징
웹 브라우저에서 동작하는 유일한 프로그래밍 언어
인터프리터interpreter 언어
모던 자바스크립트 엔진은 인터프리터와 컴파일러의 장점을 결합해 비교적 처리 속도가 느린 인터프리터의 단점을 해결 => 인터프리터는 소스코드를 즉시 실행하고 컴파일러는 빠르게 동작하는 머신코드를 생성하고 최적화함
자바스크립트는 명령형imperative, 함수형functional, 프로토타입 기반prototype-based 객체지향 프로그래밍을 지원하는 멀티 패러다임 프로그래밍 언어
3장 자바스크립트 개발 환경과 실행 방법
자바스크립트 실행 환경
웹 브라우저 : 모든 브라우저는 자바스크립트를 해석하고 실행할 수 있는 자바스크립트 엔진을 내장(렌더링 목적, 클라이언트 사이드 Web API 제공)
Node.js : Node.js도 자바스크립트 엔진을 내장(브라우저 외부에서 JS 실행 환경 제공 목적)
Node.js와 npm
npm : 자바스크립트 패키지 매니저로 Node.js에서 사용할 수 있는 모듈들을 패키지화해서 모아둔 저장소 역할과 패키지 설치 및 관리를 위한 CLI를 제공
Node.js REPL(Read Eval Print Loop) : 간단한 자바스크립트 코드를 실행해 결과를 확인해 볼 수 있음(명령어 -> $ node)
4장 변수
변수variable는 하나의 값을 저장하기 위해 확보한 메모리 공간 자체 또는 그 메모리 공간을 식별하기 위해 붙인 이름
변수란?
프로그래밍 언어에서 데이터를 관리하기 위한 핵심 개념
컴퓨터는 메모리를 사용해 데이터를 기억하고 메모리 셀의 크기 즉, 1바이트 단위로 데이터를 저장하거나 읽어옴
값을 저장하고 참조하는 매커니즘으로, 값의 위치를 가리키는 상징적인 이름
할당(대입, 저장) : 변수에 값을 저장
참조 : 변수에 저장된 값을 읽어 들이는 것
식별자
식별자 === 변수, 함수, 클래스 등의 이름
식별자는 어떤 값을 구별해서 식별할 수 있는 고유한 이름
식별자는 값이 아니라 메모리 주소를 기억
변수 선언
변수 선언declaration이란 변수를 생성하는 것
변수를 사용하려면 반드시 선언이 필요
키워드 : var, let, const
var 키워드 단점 => 블록 레벨 스코프를 지원하지 않고 함수 레벨 스코프를 지원함. 의도치 않게 전역 변수가 선언될 수 있음
var 키워드 변수 선언 후 값이 할당 되지 않은 메모리 공간에는 undefined 값이 암묵적으로 할당되어 초기화 => 자바스크립트의 독특한 특징
식별자(변수 이름)는 실행 컨텍스트에 등록
변수 선언의 실행 시점과 변수 호이스팅
변수 선언의 실행 시점 : 소스코드가 한 줄씩 순차적으로 실행되는 시점, 즉 런타임이 아니라 그 이전 단계에서 먼저 실행
변수 호이스팅 : 선언하는 모든 식별자(var,let,const,function,class)가 끌어 올려진 것처럼 동작하는 자바스크립트 고유의 특징
값의 할당
변수 선언은 소스코드가 순차적으로 실행되는 시점인 런타임 이전에 먼저 실행되지만 값의 할당은 소스코드가 순차적으로 실행되는 시점인 런타임에 실행
값의 재할당
값을 재할당할 수 없어서 변수에 저장된 값을 변경할 수 없다면 변수가 아니라 상수 => 단 한번 할당할 수 있는 변수(const 키워드)
가비지 콜렉터 : 애플리케이션이 할당한 메모리 공간을 주기적으로 검사하여 더 이상 사용되지 않는 메모리를 해제 하는 기능. 자바스크립트는 가비지 콜렉터를 내장하고 있는 매니지드 언어 로서 메모리 누수를 방지
매니지드 언어 : 메모리의 할당 및 해제를 위한 메모리 관리 기능을 언어 차원에서 담당. 어느 정도 일정한 생산성을 확보 할 수 있다는 장점이 있지만 성능 면에서 어느 정도의 손실은 감수
식별자 네이밍 규칙
식별자는 특수문자를 제외한 문자, 숫자, 언더스코어(_), 달러 기호($)를 포함할 수 있음
단, 식별자는 숫자로 시작하는 것은 허용하지 않음
예약어는 식별자로 사용할 수 없음
예약어: 프로그래밍 언어에서 사용되고 있거나 사용될 예정인 단어
자바스크립트는 대소문자를 구분
네이밍 컨벤션 : 자바스크립트에서는 변수나 함수의 이름에는 카멜 케이스를 사용하고, 생성자 함수, 클래스 이름에는 파스칼 케이스를 사용(ECMAScript사양에 정의되어 있는 객체와 함수들도 카멜 케이스와 파스칼 케이스를 사용)
5장 표현식과 문
값 value
값 : 식expression이 평가evaluate되어 생성된 결과
리터럴 literal
리터럴 : 사람이 이해할 수 있는 문자 또는 약속된 기호를 사용해 값을 생성하는 표기법notation을 말함
즉, 값을 생성하기 위해 미리 약속한 표기법
표현식 expression
표현식 : 값으로 평가될 수 있는 문statement, 표현식이 평가되면 새로운 값을 생성하거나 기존 값을 참조함
리터럴, 식별자, 연산자, 함수 호출 등의 조합으로 이뤄질 수 있음
값으로 평가될 수 있는 문은 모두 표현식
문 statement === 명령문
문 : 프로그램을 구성하는 기본 단위이자 최소 실행 단위 문의 집합으로 이뤄진 것이 프로그램이며 문을 작성하고 순서에 맞게 나열하는 것이 프로그래밍
토큰token : 문법적인 의미를 가지며, 문법적으로 더 이상 나눌 수 없는 코드의 기본 요소를 의미 (키워드, 식별자, 연산자, 리터럴, 세미콜론, 마침표 등)
세미콜론과 세미콜론 자동 삽입 기능
세미콜론(;) : 문의 종료를 나타냄
단, 중괄호({...})로 묶은 코드 블록 뒤에는 세미콜론을 붙이지 않음(자체종결성)
세미콜론 자동 삽입 기능(ASI) : 자바스크립트 엔진이 소스코드를 해석할 때 세미콜론을 자동으로 붙여줌
표현식인 문과 표현식이 아닌 문
표현식은 문의 일부일 수도 있고 그 자체로 문이 될 수도 있음
가장 간단하고 명료한 방법은 변수에 할당해 보는 것
6장 데이터 타입
데이터 타입 === 값의 종류
원시 타입
숫자number : 정수와 실수 구분없이 하나의 숫자 타입만 존재
문자열string
boolean
undefined : var 키워드로 선언된 변수에 암묵적으로 할당되는 값
null : 값이 없다는 것을 의도적으로 명시할 때 사용하는 값
symbol : ES6에서 추가된 7번째 타입
객체 타입
객체, 함수, 배열 등
숫자 타입
ECMAScript 사양에 따르면 숫자 타입의 값은 배정밀도 64비트 부동소수점 형식을 따름.
즉, 모든 수를 실수로 처리하며 정수만 표현하기 위한 데이터 타입이 별도로 존재하지 않음
자바스크립트는 2진수 8진수 16진수를 표현하기 위한 데이터 타입을 제공하지 않기 때문에 이들 값을 참조하면 모두 10진수로 해석
추가적인 세 가지 특별한 값
Infinity : 양의 무한대
-Infinity : 음의 무한대
NaN(Not-a-Number) : 산술 연산 불가
문자열 타입
0개 이상의 16비트 유니코드 문자(UTF-160)의 집합으로 전 세계 대부분의 문자를 표현
작은따옴표, 큰따옴표, 백틱(ES6)
자바스크립트의 문자열은 객체나 배열이 아닌 원시 타입이며 변경 불가능한immutable 값
템플릿 리터럴
ES6부터 템플릿 리터럴이라고 하는 새로운 문자열 표기법이 도입 (백틱``)
멀티라인 문자열multi-line string
일반 문자열 내에서는 줄바꿈 등의 공백을 표현하려면 백슬래시로 시작하는 이스케이프 시퀀스를 사용해야함(ex \n)
템플릿 리터럴 내에서는 줄바꿈이 허용되며 모든 공백도 있는 그대로 적용됨
표현식 삽입expression interpolation
${}으로 표현식을 감싸서 사용
표현식의 평가 결과가 문자열이 아니더라도 문자열로 타입이 강제로 변환되어 삽입
태그드 탬플릿tagged template
템플릿 리터럴은 런타임에 일반 문자열로 변환되어 처리
불리언 타입
논리적 참, 거짓을 나타내는 true와 false
undefined 타입
var 키워드로 선언한 변수는 암묵적으로 undefined로 초기화
변수를 참조했을 때 undefined가 반환된다면 해당 변수가 선언 이후 값이 할당된 적이 없는 즉, 초기화되지 않은 변수라는 것을 간파 할 수 있음
null 타입
null은 변수에 값이 없다는 것을 의도적으로 명시(의도적 부재)할 때 사용
변수에 null을 할당하는 것은 변수가 이전에 참조하던 값을 더 이상 참조하지 않겠다는 의미
함수가 유효한 값을 반환할 수 없는 경우 명시적으로 null을 반환하기도 함
symbol 타입
ES6에서 추가된 7번째 타입으로 다른 값과 중복되지 않는 유일무이한 값
따라서 주로 이름이 충돌할 위험이 없는 객체의 유일한 프로퍼티 키를 만들기 위해 사용
Symbol함수를 호출해 생성
(33장에서 추가 설명)
객체 타입
자바스크립트는 객체 기반의 언어이며, 자바스크립트를 이루고 있는 거의 모든 것이 객체
원시 타입 이외의 값은 모두 객체 타입
데이터 타입의 필요성
데이터 타입에 의한 메모리 공간의 확보와 참조
몇 바이트의 메모리 공간을 사용해야 낭비와 손실 없이 값을 저장할 수 있는지를 알아야 함
자바스크립트 엔진은 데이터 타입, 즉 값의 종류에 따라 정해진 크기의 메모리 공간을 확보함
심벌 테이블 : 컴파일러 또는 인터프리터는 심벌 테이블이라고 부르는 자료구조를 통해 식별자를 키로 바인딩된 값의 메모리 주소, 데이터 타입, 스코프 등을 관리함
테이터 타입에 의한 값의 해석
모든 값은 데이터 타입을 가지며 메모리에 2진수, 즉 비트의 나열로 저장됨
저장된 값은 데이터 타입에 따라 다르게 해석될 수 있음(숫자로 또는 문자로 해석하는지에 따라 값이 달라짐)
값을 저장할 때 확부해야하는 메모리 공간의 크기를 결정하기 위해
값을 참조할 때 한 번에 읽어들여야 할 메모리 공간의 크기를 결정하기 위해
메모리에서 읽어 들인 2진수를 어떻게 해석할지 결정하기 위해
동적 타이핑dynamic typing
자바스크립트의 변수는 선언이 아닌 할당에 의해 타입이 결정(타입 추론)
또한 재할당에 의해 변수의 타입은 언제든지 동적으로 변할 수 있음 === 동적 타이핑
자바스크립트는 동적 타입 언어(ex 파이썬, PHP, 루비, 리스프, 펄 등)
변수는 타입을 갖지 않지만 값은 타입을 가짐 따라서 변수에 할당되어 있는 값에 의해 변수의 타입이 동적으로 결정됨
동적 타입 언어의 단점
개발자의 의도와 상관없이 자바스크립트 엔진에 의해 암묵적으로 타입이 자동으로 변환 되기도 함(잘못된 예측)
유연성은 높지만 신뢰성은 떨어짐
주의 사항
변수는 꼭 필요한 경우에 한해 제한적으로 사용
변수의 유효 범위(스코프)는 최대한 좁게 만들어 변수의 부작용을 억제
전역 변수는 최대한 사용하지 않도록 함
변수보다는 상수를 사용해 값의 변경을 억제 함
변수 이름은 변수의 목적이나 의미를 파악할 수 있도록 네이밍
7장 연산자
산술 연산자
피연산자를 대상으로 수학적 계산을 수행해 새로운 숫자 값을 만듬
산술 연산이 불가능한 경우 NaN를 반환
+연산자는 피연산자 중 하나 이상이 문자열인 경우 문자열 연산자로 동작함
boolean타입은 엔진에 의해 암묵적 타입 변환 또는 타입 강제 변환이 일어나 1 또는 0으로 변환.
할당 연산자
우항에 있는 피연산자의 평가 결과를 좌항에 있는 변수에 할당
할당문은 값으로 평가되는 표현식인 문으로서 할당된 값으로 평가됨
비교 연산자
좌항과 우항의 피연산자를 비교한 다음 그 결과를 boolean 값으로 반환
동등 비교 연산자(==) : 값만을 비교(암묵적 타입 변환을 통해 타입을 일치시킨 후 비교)
일치 비교 연산자(===) : 값과 타입을 모두 비교
NaN : 자신과 일치하지 않는 유일한 값 NaN인지 조사하려면 number.isNaN을 사용
+0, -0 : 동일한 값으로 취급, 확실히 하기 위해서는 Object.is를 사용
삼항 조건 연산자
조건식 ? 조건식이 true일 때 return값 : 조건식이 false일 때 return값
if ...else 문은 표현식이 아닌 문이므로 값처럼 사용할 수 없음
삼항 조건 연산자 표현식은 값으로 평가할 수 있는 표현식인 문
논리 연산자
논리합(OR) ||
논리곱(AND) &&
부정(NOT) ! : 언제나 boolean값을 반환하지만 피연산자가 반드시 boolean값일 필요는 없음, 암묵적 타입 변환
typeof 연산자
피연산자의 데이터 타입을 문자열로 반환
null값을 연산해보면 null이 아닌 object를 반환(버그)
선언하지 않은 식별자를 연산하면 ReferenceError가 아닌 undefined를 반환
지수 연산자
ES7에서 도입된 지수연산자는 좌항의 피연산자를 밑으로 우항의 피연산자를 지수로 거듭제곱하여 숫자값을 반환(**)
지수 연산자는 이항 연산자 중에서 우선순위가 가장 높음
8장 제어문
조건에 따라 코드 블록을 실행(조건문)하거나 반복 실행(반복문)할 때 사용
블록문
0개 이상의 문을 중괄호로 묶은 것으로, 코드 블록 또는 블록이라고 부르기도 함({})
자바스크립트는 블록문을 하나의 실행 단위로 취급
조건문conditional statement
주어진 조건식의 평가 결과에 따라 블록문의 실행을 결정
반복문
조건식의 평가 결과가 참인 경우 블록문을 실행, 그 후 조건식을 다시 평가하여 조건식이 거짓일 때까지 반복
break 문
레이블 문, 반복문 또는 switch 문의 코드 블록을 탈출
이 외에 break문을 사용하면 문법에러SyntaxError가 발생
continue 문
반복문의 코드 블록 실행을 현 지점에서 중단하고 반복문의 증감식으로 실행 흐름을 이동 시킴
9장 타입 변환과 단축 평가
타입 변환이란?
명시적 타입 변환 or 타입 캐스팅 : 개발자가 의도적으로 값의 타입을 변환하는 것
암묵적 타입 변환 or 타입 강제 변환 : 개발자의 의도와 상관없이 표현식을 평가하는 도중에 엔진에 의해 암묵적으로 타입이 자동 변환 되는 것
타입 변환은 기존 원시 값을 직접 변경하는 것은 아님, 기존 원시 값을 사용해 다른 타입의 새로운 원시 값을 생성하는 것
자신이 작성한 코드에서 암묵적 타입 변환이 발생하는지, 발생한다면 어떤 타입의 어떤 값으로 변환되는지, 그리고 타입 변환된 값으로 표현식이 어떻게 평가될 것인지 예측 가능해야함
암묵적 타입 변환
자바스크립트 엔진은 표현식을 평가할 때 개발자의 의도와 상관없이 코드의 문맥을 고려해 암묵적으로 데이터 타입을 강제 변환 할 때가 있음
문자열, 숫자, boolean과 같은 원시 타입 중 하나로 타입을 자동 변환
문자열 타입으로 변환문자열 연결 연산자(+) 의 모든 피연산자는 코드의 문맥상 모두 문자열이어야 하기 때문에 하나 이상이 문자열이면 모두 문자열로 암묵적 타입 변환
0 + ""
=>"0"
숫자 타입으로 변환산술 연산자 의 역할은 숫자 값을 만드는 것, 따라서 산술 연산자의 모든 피연산자는 코드 문맥상 숫자 타입이어야함
숫자 타입으로 변환할 수 없는 경우 표현식의 평가 결과는 NaN이 됨
비교 연산자 의 역할은 boolean값을 만드는 것, 따라서 비교 연산자의 모든 피연산자는 코드 문맥상 숫자 타입이어야함
+ 단항 연산자는 피연산자가 숫자 타입의 값이 아니면 숫자 타입의 값으로 암묵적 타입 변환을 수행
boolean 타입으로 변환제어문 또는 삼항 조건 연산자의 조건식은 논리적 참/거짓으로 평가되어야 하는 표현식으로 자바스크립트 엔진은 조건식의 평가 결과를 암묵적 타입 변환 함
자바스크립트 엔진은 boolean 타입이 아닌 값을 Truthy값(참으로 평가되는 값) 또는 Falsy값(거짓으로 평가되는 값)으로 구분
Falsy 값 : false, undefined, null, 0, -0, NaN, ""(빈 문자열)
명시적 타입 변환
표준 빌트인 생성자 함수(String, Number, Boolean)를 new 연산자 없이 호출하는 방법
빌트인 메서드를 사용하는 방법
단축 평가
논리 연산자를 사용한 단축 평가
논리합(||)또는 논리곱(&&) 연산자 표현식의 평가 결과는 boolean값이 아닐 수도 있음
논리합(||)또는 논리곱(&&) 연산자 표현식은 언제나 2개의 피연산자 중 어느 한쪽으로 평가됨
논리합(||)과 논리곱(&&) 연산자는 논리 연산의 결과를 결정하는 피연산자를 타입 변환하지 않고 그대로 반환 => 단축 평가
즉 단축 평가는 표현식을 평가하는 도중에 평가 결과가 확정된 경우 나머지 평가 과정을 생략하는 것
단축 평가를 사용하면 if문을 대체할 수 있음
객체를 가리키기를 기대하는 변수가 null 또는 undefined가 아닌지 확인하고 프로퍼티를 참조할 때
함수 매개변수에 기본값을 설정할 때
옵셔널 체이닝 연산자
ES11(ECMAScript2020)에서 도입된 옵셔널 체이닝 연산자 ?.는 좌항의 피연산자가 null 또는 undefined인 경우 undefined를 반환하고 그렇지 않으면 우항의 프로퍼티 참조를 이어감
이 때 좌항 피연산자가 false로 평가되는 Falsy값(false, undefined, null, 0, -0, NaN, "")이라도 null또는 undefined가 아니면 우항의 프로퍼티 참조를 이어감
null 병합 연산자
ES11(ECMAScript2020)에서 도입된 null 병합 연산자 ??는 좌항의 피연산자가 null 또는 undefined인 경우 우항의 피연산자를 반환하고 그렇지 않으면 좌항의 피연산자를 반환
변수에 기본값을 설정할 때 유용
좌항 피연산자가 false로 평가되는 Falsy값(false, undefined, null, 0, -0, NaN, "")이라도 null또는 undefined가 아니면 좌항의 피연산자를 그대로 반환
10장 객체 리터럴
객체란?
자바스크립트는 객체 기반의 프로그래밍 언어이며, 원시 값을 제외한 나머지 값(함수, 배열, 정규 표현식 등)은 모두 객체
원시 타입의 값, 즉 원시 값은 변경 불가능한(immutable) 값이지만 객체 타입의 값, 즉 객체는 변경 가능한(mutable) 값
객체는 0개 이상의 프로퍼티로 구성된 집합이며 프로퍼티는 key와 value로 구성
프로퍼티 : 객체의 상태를 나타내는 값(data)
메서드 : 프로퍼티(상태 데이터)를 참조하고 조작할 수 있는 동작(behavior)
객체 리터럴에 의한 객체 생성
자바스크립트는 프로토타입 기반 객체지향 언어로서 클래스 기반 객체지향 언어와는 달리 다양한 객체 생성 방법을 지원
객체 리터럴 : {...}
Object 생성자 함수
생성자 함수
Object.create 메서드
클래스(ES6)
프로퍼티
객체는 프로퍼티의 집합이며, 프로퍼티는 key와 value로 구성
프로퍼티 key : 빈 문자열을 포함하는 모든 문자열 또는 심벌 값
프로퍼티 value : 자바스크립트에서 사용할 수 있는 모든 값
식별자 네이밍 규칙을 따르지 않는 이름에는 반드시 따옴표를 사용
프로퍼티 key에 문자열이나 심벌 값 외의 값을 사용하면 암묵적 타입 변환을 통해 문자열이 됨
프로퍼티 key르 중복 선언하면 나중에 선언한 프로퍼티가 덮어씀, 에러가 발생하지 않는다는 점 주의
메서드
자바스크립트의 함수는 객체(일급 객체)
따라서 함수는 값으로 취급할 수 있기 때문에 프로퍼티 값으로 사용
일반 함수와 구분하기 위해 메서드라 부름
프로퍼티 접근
마침표 표기법 : 마침표 프로퍼티 접근 연산자(.) 사용
대괄호 표기법 : 대괄호 프로퍼티 접근 연산자([...]) 사용
대괄호 프로퍼티 접근 연산자 내부에 지정하는 프로퍼티 키는 반드시 따옴표로 감싼 문자열
객체에 존재하지 않는 프로퍼티에 접근하면 undefined를 반환(ReferenceError발생안함)
프로퍼티 값 갱신
이미 존재하는 프로퍼티에 값을 할당하면 프로퍼티 값이 갱신
프로퍼티 동적 생성
존재하지 않는 프로퍼티에 값을 할당하면 프로퍼티가 동적으로 생성되어 추가되고 프로퍼티 값이 할당
프로퍼티 삭제
delete 연산자는 객체의 프로퍼티를 삭제
이때 delete 연산자의 피연산자는 프로퍼티 값에 접근할 수 있는 표현식이어야함(아니라면 에러없이 무시됨)
ES6에서 추가된 객체 리터럴의 확장 기능
프로퍼티 축약 표현 : 프로퍼티 값으로 변수를 사용하는 경우, 변수 이름과 프로퍼티 키가 동일한 이름일 때 프로퍼티 키를 생략할 수 있음(키 === 변수이름으로 자동생성)
계산된 프로퍼티 이름 : 문자열 또는 문자열로 타입 변환할 수 있는 값으로 평가되는 표현식을 사용해 프로퍼티 키를 동적으로 생성(단, 키로 사용할 표현식을 대괄호로 묶어야함)
메서드 축약 표현
Last updated