Chapter1. 원시 자료형과 참조 자료형
Chapter2. 스코프
2-1 스코프 & 스코프 규칙
2-2 변수 선언할 때 주의할 점Chapter3. 클로저
Chapter4. ES6 주요 문법
원시 자료형(primitive data type):
number
,string
,boolean
과 같은 고정된 저장 공간을 차지하는 데이터
반면에 대량의 데이터를 다루기에 적합한 배열과 객체는 참조 자료형(reference data type)
데이터를 저장하는 방식에 따른 분류
객체가 아니면서 method를 가지지 않는 6 가지의 타입
: string, number, bigint, boolean, undefined, symbol, (null)
배열([]), 객체({}), 함수(function(){})
대량의 데이터를 쉽게 다루기 위해
let
, const
, var
)와 스코프와의 관계를 설명할 수 있다.변수 접근 규칙에 따른 유효 범위.
변수에 접근할 수 있는 범위가 존재한다. 중괄호 안쪽에 변수가 선언되었는지, 바깥쪽에 선언되었는지의 여부가 중요하다. 이 범위를 스코프라고 한다.
중괄호를 기준으로 범위가 구분됨.
function 키워드가 등장하는 함수 선언식 및 함수 표현식은 함수 스코프를 만든다.
"외부 함수의 변수에 접근할 수 있는 내부 함수"
"함수와 함수가 선언된 어휘적(lexical) 환경의 조합을 말한다. 이 환경은 클로저가 생성된 시점의 유효 범위 내에 있는 모든 지역 변수로 구성된다."
일반적인 함수는 함수 실행이 끝나고 나면 함수 내부의 변수를 사용할 수 없다.
그러나 클로저는 외부 함수의 실행이 끝나도 외부 함수 내 변수가 메모리 상에 저장된다. (어휘적 환경을 메모리에 저장하기 때문)
클로저는 특정 데이터를 시코프 안에 가두어 둔 채로 계속 사용할 수 있게 해준다.
const tagMaker = tag => content => `<${tag}>${content}</${tag}>`
const divMaker = tagMaker('div');
dovMaker('hello') // '<div>hello</div>'
divMaker('codestates') // '<div>codestates</div>'
const anchorMaker = tagMaker('a')
anchorMaker('go') // '<a>go</a>'
anchorMaker('urclass') // '<a>urclass</a>'
클로저를 이용해 내부 함수를 단 하나만 리턴하는 것에 그치지 않고, 객체를 담아 여러 개의 내부 함수를 리턴하도록 만들 수 있다.
함수 재사용성을 극대화하여 함수 하나를 완전히 독립적인 부품 형태로 분리하는 것.
클로저를 통해 데이터와 메서드를 같이 묶어서 다룰 수 있다. 즉, 클로저는 모듈화에 유리하다
문자열, 배열 요소를 "펼쳐"주는 문법
주로 배열을 풀어서 인자로 전달하거나, 배열을 풀어서 각각의 요소로 넣을 때 사용한다.
기존 배열을 변경하지 않는다(immutable)
function sum(x, y, z) {
return x + y + z;
}
const numbers = [1, 2, 3];
sum(...numbers) // 6
파라미터를 배열의 형태로 받아서 사용할 수 있다.
남아있는 모든 인자를 하나의 배열에 담는다.
파라미터 개수가 가변적일때 유용함
function sum(...theArgs) {
return theArgs.reduce((previous, current) => {
return previous + current;
});
}
sum(1,2,3) // 6
sum(1,2,3,4) // 10
spread 문법은 배열에서 효과적
let parts = ['shoulders', 'knees'];
let lyrics = ['head', ...parts, 'and', 'toes'];
// ['head', 'shoulders', 'knees', 'and', 'toes']
let arr1 = [0, 1, 2];
let arr2 = [3, 4, 5];
arr1 = [...arr1, ...arr2]; // 참고: spread 문법은 기존 배열을 변경하지 않으므로(immutable), arr1의 값을 바꾸려면 새롭게 할당해야 합니다.
// [0, 1, 2, 3, 4, 5]
let arr = [1, 2, 3];
let arr2 = [...arr]; // arr.slice() 와 유사
arr2.push(4); // 참고: spread 문법은 기존 배열을 변경하지 않으므로(immutable), arr2를 수정한다고, arr이 바뀌지 않습니다.
// arr = [1, 2, 3] , arr2 [1, 2, 3, 4]
let obj1 = { foo: 'bar', x: 42 };
let obj2 = { foo: 'baz', y: 13 };
let clonedObj = { ...obj1 };
let mergedObj = { ...obj1, ...obj2 };
// 질문: clonedObj와 mergedObj의 값은 각각 무엇인가요?
// {foo: 'bar', x: 42} , {foo: 'baz', x: 42, y: 13}
function myFun(a, b, ...manyMoreArgs) {
console.log("a", a);
console.log("b", b);
console.log("manyMoreArgs", manyMoreArgs);
}
myFun("one", "two", "three", "four", "five", "six");
// 질문: 콘솔은 순서대로 어떻게 찍힐까요?
// a one
// b two
// manyMoreArgs (4) ['three', 'four', 'five', 'six']
spread 문법을 이용하여 값을 해체한 후, 개별 값을 변수에 새로 할당하는 과정
const [a, b, ...rest] = [10, 20, 30, 40, 50];
// 질문: a, b, rest는 각각 어떤 값인가요?
// 10, 20, [30, 40, 50]
const {a, b, ...rest} = {a: 10, b: 20, c: 30, d: 40}
// 질문: a, b, rest는 각각 어떤 값인가요?
// 10, 20, {c: 30, d: 40}
function whois({displayName: displayName, fullName: {firstName: name}}){
console.log(displayName + " is " + name);
}
let user = {
id: 42,
displayName: "jdoe",
fullName: {
firstName: "John",
lastName: "Doe"
}
};
whois(user)