웹 페이지(HTML 문서)를 자바스크립트에서 조작할 수 있도록 객체로 표현한 구조
HTML을 자바스크립트에서 다룰 수 있도록 만든 트리 구조
✅ DOM은 HTML을 자바스크립트에서 다룰 수 있도록 트리 구조로 표현한 것
✅ 자바스크립트로 HTML 요소를 가져오고, 수정하고, 추가하고, 삭제할 수 있음
✅ 이벤트를 추가해서 동적인 웹 페이지를 만들 수 있음
<!DOCTYPE html>
<html>
<head>
<title>My Page</title>
</head>
<body>
<h1>Hello, World!</h1>
<p>This is a paragraph.</p>
</body>
</html>
Document
├── <html>
│ ├── <head>
│ │ ├── <title> → "My Page"
│ ├── <body>
│ ├── <h1> → "Hello, World!"
│ ├── <p> → "This is a paragraph."
프로그레시브 자바스크립트 프레임워크
- 웹 사용자 인터페이스를 만들기 위한 쉽고 강력하며 다재다능한 프레임워크
MVVM 패턴
- Model-View-ViewModel
가상 DOM
- 브라우저 메모리에서 관리하는 DOM에 대한 추상 객체
- 빠른 UI 렌더링 성능을 제공
- 브라우저 DOM은 화면에 그리는 직접 그리는 작업을 수행
- 가상 DOM은 변경된 부분을 탐지하는 것이 목적
- ✅ 데이터가 수정되었을 때 액션을 취하겠다


ES6는 이전 버전의 문법을 포함하여 지원하면서 Class, Arrow Function 등 새로운 문법을 추가로 지원함
ES6 미지원 브라우저에 대한 대처
var 변수의 호이스팅
자바스크립트가 실행될 때 선언문을 먼저 해석 후 실행
변수의 선언문이 사용하는 문장 후에 있어도 해당 변수를 인식
console.log(A1); // undefined
var A1 = "hello"; // 여기서 선언한 걸 위에서도 쓸 수 있음(호이스팅)
// 재선언도 가능
// 비권장
함수 단위로 호이스팅
변수 선언을 여러 번 할 수 있음(에러가 아님)
let 변수
const
값 변경 불가 → 상수 선언
범위(scope)는 let과 동일
참조 변수인 경우 참조는 변경 불가
- 필드는 수정 가능
⇒ 객체 내부의 속성을 변경할 수는 있지만 새로운 객체를 생성하여 할당하는 것은 허용하지 않는다!
const p1 = { name: 'john', age: 20 };
p1.age = 22;
console.log(p1); // { name: 'john', age: 22 }
//p1 = { name: 'lee', age: 25 }; // 불가능
// typeError: Assignment to constant variable.
```
기본 파라미터(Default Parameter): 함수 파라미터의 기본값을 지정
가변 파라미터(Rest Parameter): 여러 개의 파라미터 값을 배열로 받을 수 있도록 함
전달된 인수를 매개변수로 매칭한 후,
매칭되지 않은 인수를 모아 배열로 지정 → 가변 파라미터로 전달
function func(arg1, arg2, ...argv) {...}
-> 배열
1개만 지정 가능, 마지막 매개변수에만 지정 가능
function foodReport(name, age, ...favoriteFoods) {
console.log(name + ", " + age);
console.log(favoriteFoods);
}
foodReport("이몽룡", 20, "짜장면", "냉면", "불고기");
foodReport("홍길동", 16, "초밥");
foodReport("이", 20);
이몽룡, 20
[ '짜장면', '냉면', '불고기' ]
홍길동, 16
[ '초밥' ]
이, 20
[] -> 빈 배열이 출력됨
배열, 객체의 값들을 추출하여 한 번에 여러 변수에 할당할 수 있는 기능
함수의 파라미터에서도 사용 가능
// 많이 쓰는 기법
function addContact1({name, phone, email="이메일없음", age=0}) { // 여기서 대입은 기본값
console.log(name,phone,email,age);
}
addContact1({ name : "이몽룡", phone : "010-3434-8989" }) // 키워드 인수 전달(호출)
// 객체를 표현할 때 순서는 상관이 없음
-> 함수를 호출할 때 전달한 객체를 구조분해 할당으로 받아내면서 기본 파라미터까지 지정한 것
function addContact2(contact) { // 객체 하나로 받아줌
if (!contact.email) contact.email = "이메일없음";
if (!contact.age) contact.age = 0;
let { name, phone, email, age} = contact;
console.log(name,phone,email,age);
}
addContact2({ name : "이몽룡", phone : "010-3434-8989" })
-> 인자를 객체로 전달하도록 한 함수
function addContact3(name,phone,email="이메일없음",age=0) { // 중괄호를 안 붙임 -> 위치 기반
console.log(name,phone,email,age);
}
addContact3("이몽룡","010-3434-8989")
-> 기본 파라미터만 적용한 함수
화살표 함수의 형식
기존 함수 표현식 간결화
함수를 정의하는 영역의 this를 그대로 전달받을 수 있음
함수의 본체가 한 줄 문장인 경우
(a,b) => {a,b} // {a:a, b:b}를 원했지만 실제로 실행하면 이게 아님 -> return undefined
// 중괄호의 해석을 문제(함수의 코드블럭을 나타내는 중괄호로 해석됨)
// 객체 내부가 아니다!
(a,b) => ({a,b}) // 객체의 리터럴이 됨, 괄호로 반드시 묶어주어야 함
자바스크립트의 this
자바스크립트의 this 지정
자바스크립트 함수, 메서드는 어떤 객체의 메서드 형태로 호출되느냐가 this를 결정하는 기본적인 규칙
함수, 메서드를 호출할 때 직접 연결할 this를 지정하고 싶다면?
(함수 수준의 메서드 이용하기!)
bind() 지정한 객체를 this로 미리 연결한(binding) 새로운 함수를 리턴(영구적으로 바꿈)
apply(), call() 지정한 객체를 this로 연결한 후 함수를 직접 호출(이번 한번만 바꿔서 호출하겠다?)
화살표 함수에서의 this
… 연산자
배열이나 객체를 …연산자와 함께 객체 또는 배열에서 사용 → 객체, 배열 내의 값을 분해된 값으로 전달
기존 값을 복사하거나, 기존 값을 복사하면서 새로운 항목 추가시 사용
let obj2 = obj1 : 참조를 통해 서로 다른 두 객체가 같은 내용을 공유하겠다(동일한 객체 참조)
let obj3 = {...obj1} : 복사(객체 내부의 값은 복사하지만 서로 다른 객체임)
let obj4 = {...obj1, color} : 기존 객체(color)가 있었다면 업데이트, 없었다면 추가가 됨(새로운 속성 추가)