함수에 객체나 배열을 '부분적으로' 전달해야할 상황이 생긴다. 이 때 용이한 것이 바로 '구조분해할당'이다. 구조분해할당은 배열이나 객체를 해체하여 그 값을 개별 변수에 담는 것을 말한다.
rest/spread 문법을 배열 분해에 적용할 수 있다.
// MDN 예시
({a, b, ...rest} = {a: 10, b: 20, c: 30, d: 40});
console.log(a); // 10
console.log(b); // 20
console.log(rest); // {c: 30, d: 40}
// 다만, rest문법은 변수들 중 마지막에만 올 수 있음!
//javascript.info 예시
let options = {
title: "Menu",
width: 100,
height: 200
};
let {title, width, height} = options;
alert(title); // Menu
alert(width); // 100
alert(height); // 200
// 모양새를 잘 기억하기!
const student = { name: '최초보', major: '물리학과' }
const { name, ...args } = student
expect(name).to.eql('최초보')
expect(args).to.eql({major: '물리학과'})
// args에는 뒷부분 키값이 통째로 담긴다.
const info = {name: 'john', age: 25, gender: 'male', job: 'salesman'}
function introduce({name, age, job: occupation}){
return `${name}, ${age}, ${occupation}`
}
console.log(introduce(info)); // john, 25, salesman
// job: occupation 이 부분은 키값을 교체하는 것!
전역 환경에서의 this만 module.exports고, 함수 선언문 안의 this는 global입니다! 매우 놀라운 현상이죠. 화살표 함수의 경우는 this가 상위 환경의 this를 물려받기 때문에 module.exports와 같습니다. 노드에서는 전역 환경의 this만 global이 아니라 module.exports를 가리킨다는 사실을 알아두세요. 출처
Global은 브라우저의 Window객체와 같은 개념, 전역변수를 담는 것
반면, module.export는 CommonJS에서 쓰는 객체모음집
그리고 module.export에는 빈객체가 하나 들어있음
(완벽히 이해하지는 못한 관계로 정리만 해둔다.)
// MDN 예시
function Car(make, model, year) {
this.make = make;
this.model = model;
this.year = year;
}
const car1 = new Car('Eagle', 'Talon TSi', 1993);
console.log(car1.make);
// expected output: "Eagle"
// Koans 예시
let this_value_in_constructor;
function Car(name, brand, color) {
this.name = name;
this.brand = brand;
this.color = color;
this_value_in_constructor = this;
}
const mycar = new Car('mini', 'bmw', 'red')
expect(this_value_in_constructor).to.eql(mycar)
// Koans 예시
function printProfile(name, age, ...args) {
return `${this.type} ${name} 나이:${age}${args.length === 0 ? '' : ' ' + this.feature + ':' + args.join(',')}`
}
const developer = { type: '개발자', feature: '언어' }
const artist = { type: '아티스트', feature: '노래' }
expect(printProfile.call(developer, '김코딩', 30)).to.eql('개발자 김코딩 나이:30')
expect(printProfile.apply(developer, ['김코딩', 30])).to.eql('개발자 김코딩 나이:30')
let arr = {
0: 'a',
1: 'b',
2: 'c',
3: 'd',
length: 4
};
// 반드시 length를 가져야 한다.
// arguments나 dom의 예시(참고자료 참고)가 이미 유사 배열로 되어있다.