본문으둜 κ±΄λ„ˆλ›°κΈ°

🌈 Chapter 5 : λ°˜λ³΅λ¬Έμ„ λ‹¨μˆœν•˜κ²Œ λ§Œλ“€μ–΄λΌ.

🎯 ν™”μ‚΄ν‘œ ν•¨μˆ˜λ‘œ λ°˜λ³΅λ¬Έμ„ λ‹¨μˆœν•˜κ²Œ λ§Œλ“€μ–΄λΌ.​

  • λŒ€λΆ€λΆ„μ˜ λ°˜λ³΅λ¬Έμ€ 콜백 ν•¨μˆ˜(callback function)에 μ˜μ‘΄ν•œλ‹€.

  • ν™”μ‚΄ν‘œ ν•¨μˆ˜(arrow function)λŠ” ν•¨μˆ˜κ°€ μž₯ν™©ν•΄μ§€λŠ” 문제λ₯Ό ν•΄κ²°ν•΄μ„œ ν•¨μˆ˜ μž‘μ„±μ„ κ°„κ²°ν•˜κ³  짧게 λ§Œλ“€μ–΄ μ€€λ‹€.

  • ν™”μ‚΄ν‘œ ν•¨μˆ˜λŠ” ν•„μš”ν•˜μ§€ μ•Šμ€ 정보λ₯Ό μ΅œλŒ€ν•œ κ±·μ–΄λ‚Έλ‹€.

    • function ν‚€μ›Œλ“œ
    • 인수λ₯Ό κ°μ‹ΈλŠ” κ΄„ν˜Έ
    • return ν‚€μ›Œλ“œ
    • μ€‘κ΄„ν˜Έ
  • μ•„λž˜λŠ” κ°„λ‹¨ν•œ ν•¨μˆ˜μ΄λ‹€. 이 ν•¨μˆ˜λŠ” κΈ°λͺ… ν•¨μˆ˜μ΄λ‹€. λ˜ν•œ, ν•¨μˆ˜ μ„ μ–Έ(function declaration)이닀.

function capitalize(name) {
return name[0].toUpperCase() + name.slice(1);
}
const capitalize = function(name) {
return name[0].toUpperCase() + name.slice(1);
}
  • μ—¬κΈ°μ„œ function ν‚€μ›Œλ“œλ₯Ό μ œκ±°ν•˜κ³  ν™”μ‚΄ν‘œλ‘œ λŒ€μ²΄ν•  수 μžˆλ‹€. λ˜ν•œ, λ§€κ°œλ³€μˆ˜κ°€ ν•˜λ‚˜λΏμ΄λΌλ©΄ κ΄„ν˜Έλ„ μ œκ±°ν•  수 μžˆλ‹€.
const capitalize = name => {
return name[0].toUpperCase() + name.slice(1);
}
  • λ§€κ°œλ³€μˆ˜κ°€ 두 개 이상이면 κ΄„ν˜Έλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.
const greet = (first, last) => {
return `μ•ˆλ…•ν•˜μ„Έμš”! ${capitalize(first)} ${capitalize(last)}λ‹˜`;
}
  • ν•¨μˆ˜λ₯Ό ν•œ μ€„λ‘œλ§Œ μž‘μ„±ν•  λ•ŒλŠ” return ν‚€μ›Œλ“œλ„ μ‚¬μš©ν•  ν•„μš”κ°€ μ—†λ‹€. 즉, ν•¨μˆ˜ λͺΈμ²΄μ˜ μ‹€ν–‰ κ²°κ³Όλ₯Ό μžλ™μœΌλ‘œ λ°˜ν™˜ν•œλ‹€.
const formatUser = name => `${capitalize(name)}λ‹˜μ΄ λ‘œκ·ΈμΈν–ˆμŠ΅λ‹ˆλ‹€.`;
  • ν™”μ‚΄ν‘œ ν•¨μˆ˜λ₯Ό λ³€μˆ˜μ— ν• λ‹Ήν•˜μ§€ μ•Šκ³  읡λͺ… ν•¨μˆ˜λ‘œ μ‚¬μš©ν•  μˆ˜λ„ μžˆλ‹€.
  • μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ ν•¨μˆ˜λ₯Ό λ‹€λ₯Έ ν•¨μˆ˜μ— 인수둜 전달할 수 μžˆλ‹€. (예둜 콜백 ν•¨μˆ˜λ₯Ό 인수둜 ν•˜λŠ” ν•¨μˆ˜)
function applyCustomGreeting(name, callback) {
return callback(capitalize(name));
}
  • 원본 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œ 읡λͺ… ν•¨μˆ˜λ₯Ό μƒμ„±ν•œ 방법
  • ν•¨μˆ˜ applyCustomGreetingλ₯Ό ν˜ΈμΆœν•˜λ©΄μ„œ 읡λͺ… ν•¨μˆ˜λ₯Ό μž‘μ„±ν•΄ 전달.
applyCustomGreeting('mark', function(name) {
return `μ•ˆλ…•, ${name}!`;
});
// "μ•ˆλ…•, Mark!"
  • μœ„ μ½”λ“œμ˜ 읡λͺ… ν•¨μˆ˜λ₯Ό ν™”μ‚΄ν‘œ ν•¨μˆ˜λ‘œ λ³€κ²½ν•  수 μžˆλ‹€.
applyCustomGreeting('mark', name => `μ•ˆλ…•, ${name}!`);
// "μ•ˆλ…•, Mark!"

🎯 λ°°μ—΄ λ©”μ„œλ“œλ‘œ λ°˜λ³΅λ¬Έμ„ 짧게 μž‘μ„±ν•˜λΌ.​

  • forλ¬Έκ³Ό for...of 문도 μ’‹μ§€λ§Œ 적게 μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€.
  • forλ¬Έκ³Ό for...of 문은 λΆˆν•„μš”ν•  μ •λ„λ‘œ μ–΄μˆ˜μ„ ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.
  • κ·Έλ ‡κΈ° λ•Œλ¬Έμ— λ°°μ—΄ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ λ°˜λ³΅λ¬Έμ„ ν•œ μ€„λ‘œ 쀄일 수 μžˆλ‹€.
  • μ•„λž˜μ˜ μ½”λ“œλŠ” for문을 μ‚¬μš©ν•˜μ˜€λ‹€.
const prices = ['1.0', 'little prince', '2.15'];

const formattedPrices = [];
for(let i = 0; i < prices.length; i++) {
const price = parseFloat(prices[i]);
if(price){
formattedPrices.push(price);
}
}
// [1, 2.15]
  • μœ„ μ½”λ“œλŠ” λ‹¨μˆœν•˜μ§€ λͺ»ν•˜κ³ , 가독성 λ˜ν•œ μ½”λ“œκ°€ λŠ˜μ–΄λ‚ μˆ˜λ‘ λ–¨μ–΄μ§ˆ 것이닀.
  • κ·Έλ ‡λ‹€κ³  예츑 κ°€λŠ₯ν•œ μ½”λ“œλ„ μ•„λ‹ˆλ‹€. μ½”λ“œμ—μ„œ μƒμ„±ν•œ 빈 배열은 μƒμˆ˜κ°€ μ•„λ‹ˆλ―€λ‘œ λ‚˜μ€‘μ— 변경될 μˆ˜λ„ 있고, 그렇지 μ•Šμ„ μˆ˜λ„ μžˆλ‹€.
  • μ΄λŸ¬ν•œ μ½”λ“œλ₯Ό λ°°μ—΄ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ λΆˆν•„μš”ν•œ 데이터λ₯Ό λ°°μ œν•œ, κ°„κ²°ν•˜κ³  예츑 κ°€λŠ₯ν•œ μ½”λ“œλ₯Ό λ§Œλ“€ 수 μžˆλ‹€.
  • 거의 λŒ€λΆ€λΆ„μ˜ λ°°μ—΄ λ©”μ„œλ“œλŠ” λ°˜ν™˜λ˜λŠ” λ°°μ—΄μ˜ κΈΈμ΄λ‚˜ ν˜•νƒœλ₯Ό λ³€κ²½ν•  수 μžˆλ‹€.
  • map(): ν˜•νƒœλ₯Ό λ°”κΏ€ 수 μžˆμ§€λ§Œ κΈΈμ΄λŠ” μœ μ§€λœλ‹€.
  • sort(): ν˜•νƒœλ‚˜ κΈΈμ΄λŠ” λ³€κ²½λ˜μ§€ μ•Šκ³  μˆœμ„œλ§Œ λ°”κΎΌλ‹€.
  • filter(): 길이λ₯Ό λ³€κ²½ν•˜μ§€λ§Œ ν˜•νƒœλŠ” 바꾸지 μ•ŠλŠ”λ‹€.
  • find(): 배열을 λ°˜ν™˜ν•˜μ§€ μ•Šκ³ , ν•œ 개의 데이터가 λ°˜ν™˜λ˜κ³  ν˜•νƒœλŠ” λ°”λ€Œμ§€ μ•ŠλŠ”λ‹€.
  • forEach(): ν˜•νƒœλ₯Ό μ΄μš©ν•˜μ§€λ§Œ 아무것도 λ°˜ν™˜ν•˜μ§€ μ•ŠλŠ”λ‹€.
  • reduce(): 길이와 ν˜•νƒœλ₯Ό λ°”κΎΈλŠ” 것을 λΉ„λ‘―ν•΄ 무엇이든 μ²˜λ¦¬ν•  수 μžˆλ‹€.
  • μœ„μ˜ 예제 μ½”λ“œλ₯Ό λ°°μ—΄ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μž‘μ„±ν•  수 μžˆλ‹€.
const prices = ['1.0', 'little prince', '2.15'];
const formattedPrices = prices.map(price => parseFloat(price)).filter(price => price);
// [1, 2.15]

🎯 map() λ©”μ„œλ“œλ‘œ λΉ„μŠ·ν•œ 길이의 배열을 μƒμ„±ν•˜λΌ.​

  • 맡 ν•¨μˆ˜λŠ” μž…λ ₯ν•œ λ°°μ—΄μ˜ 정보 쀑 ν•œ 쑰각을 λ°›μ•„ μƒˆλ‘œμš΄ 값을 λ°˜ν™˜ν•œλ‹€.
  • λ•Œλ‘œλŠ” μ •λ³΄μ˜ 일뢀λ₯Ό λ°˜ν™˜ν•˜κΈ°λ„ ν•˜κ³ , 정보λ₯Ό λ³€ν˜•ν•΄μ„œ μƒˆλ‘œμš΄ 값을 λ°˜ν™˜ν•˜κΈ°λ„ ν•œλ‹€.
  • 즉, 배열에 μžˆλŠ” ν•œ 가지 속성을 λ°˜ν™˜ν•˜κ±°λ‚˜ 배열에 μžˆλŠ” 값을 κ°€μ Έμ™€μ„œ λ‹€λ₯Έ ν˜•μ‹μ˜ 값을 λ°˜ν™˜ν•œλ‹€.
  • λ¨Όμ € for 문으둜 μž‘μ„±ν•΄ 보자.
const band = [
{ name: 'corbett', instrument: 'guitar' },
{ name: 'evan', instrument: 'guitar' },
{ name: 'sean', instrument: 'bass' },
{ name: 'brett', instrument: 'drums' },
];

const instruments = [];
for(let i = 0; i < band.length; i++) {
const instrument = band[i].instrument;
instruments.push(instrument);
}
  • forλ¬Έ μ•ˆμ— μžˆλŠ” λ‘œμ§μ„ ν•¨μˆ˜λ‘œ λ”°λ‘œ 뢄리해 쀄 수 μžˆλ‹€.
function getInstrument(member) {
return member.instrument;
}

const instruments = [];
for(let i = 0; i < band.length; i++) {
instruments.push(getInstrument(band[i]));
}
  • λŒ€λΆ€λΆ„μ˜ 경우 λ°°μ—΄ λ©”μ„œλ“œμ—λŠ” 읡λͺ… ν•¨μˆ˜λ₯Ό μž‘μ„±ν•˜μ§€λ§Œ ν•„μˆ˜μ μ΄μ§€λŠ” μ•Šλ‹€.
  • ν•„μš”ν•˜λ‹€λ©΄ κΈ°λͺ… ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•  μˆ˜λ„ μžˆλ‹€.
  • 이젠 map() λ°°μ—΄ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•΄ for문을 μ‚¬μš©ν•˜μ§€ μ•Šκ³  μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆλ‹€.
function getInstrument(member) {
return member.instrument;
}
const instruments = band.map(getInstrument);
// ["guitar", "guitar", "bass", "drums"]
  • μœ„μ˜ κΈ°λͺ… ν•¨μˆ˜λ₯Ό 읡λͺ… ν•¨μˆ˜λ‘œ λ°”κΏ€ 수 μžˆλ‹€. ν™”μ‚΄ν‘œ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ λ³€κ²½ν•  수 μžˆλ‹€.
const instruments = band.map(member => member.instrument);
// ["guitar", "guitar", "bass", "drums"]
  • map() λ©”μ„œλ“œλŠ” 원본 λ°°μ—΄κ³Ό 같은 길이의 배열을 μƒμ„±ν•˜λŠ” 경우라면 λͺ¨λ“  곳에 μ‚¬μš©ν•  수 μžˆλ‹€.

🎯 filter()와 find()둜 λ°μ΄ν„°μ˜ 뢀뢄집합을 μƒμ„±ν•˜λΌ.​

  • filter() λ©”μ„œλ“œλŠ” map() λ©”μ„œλ“œμ™€ λ‹€λ₯΄κ²Œ 배열에 μžˆλŠ” 정보λ₯Ό λ³€κ²½ν•˜μ§€ μ•Šκ³  λ°˜ν™˜λ˜λŠ” λ°°μ—΄μ˜ 길이λ₯Ό 쀄인닀.
const team = [
'Harang B',
'Dave L',
'Dave C',
'Seungmin B',
'Dain M',
];
  • μœ„ team 배열에 Davλ₯Ό ν¬ν•¨ν•˜λŠ”μ§€ ν™•μΈν•˜κΈ° μœ„ν•΄ λ¬Έμžμ—΄μ— match() λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.
  • for문을 μ΄μš©ν•œ μ˜ˆμ „ 방법.
const daves = [];
for(let i = 0; i < team.length; i++) {
if(team[i].match(/Dav/)) {
daves.push(team[i]);
}
}
// ["Dave L", "Dave C"]
  • filter() λ©”μ„œλ“œλŠ” μ „λ‹¬ν•˜λŠ” ν•¨μˆ˜λŠ” λ°˜λ“œμ‹œ 참값을 λ°˜ν™˜ν•΄μ•Ό ν•œλ‹€.
  • λ§Œμ•½ 참값을 λ°˜ν™˜ν•˜μ§€ μ•ŠμœΌλ©΄ ν•΄λ‹Ή 값은 μƒˆλ‘œμš΄ 배열에 담기지 μ•ŠλŠ”λ‹€.
  • λ˜ν•œ, λ°˜ν™˜λ˜λŠ” 배열은 μ›λ³Έμ˜ λ°°μ—΄ μˆœμ„œλ„ κ·ΈλŒ€λ‘œ μœ μ§€ν•œλ‹€.
  • μ€‘μš”ν•œ 점은 filter() λ©”μ„œλ“œλŠ” 항상 배열을 λ°˜ν™˜ν•˜λ©΄ 쑰건에 μΌμΉ˜ν•˜μ§€ μ•ŠλŠ” 값이 μ—†λŠ” κ²½μš°μ—λ„ 빈 배열을 λ°˜ν™˜ν•œλ‹€.
const daves = team.filter(member => member.match(/Dav/));
  • μ˜€λ‘œμ§€ μΌμΉ˜ν•˜λŠ” ν•­λͺ©μ΄ ν•˜λ‚˜λΏμΌ λ•ŒλŠ” find() λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.
  • find() λ©”μ„œλ“œλŠ” μ°Έ λ˜λŠ” 거짓 값을 λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜λ₯Ό 인수둜 ν•˜κ³ , λ°°μ—΄μ˜ ν•­λͺ©μ— μ „λ‹¬ν•œ ν•¨μˆ˜λ‘œ 평가해 참값을 λ°˜ν™˜ν•˜λŠ” 첫 번째 ν•­λͺ©λ§Œ λ°˜ν™˜ν•œλ‹€.
  • 참값을 λ°˜ν™˜ν•˜λŠ” ν•­λͺ©μ΄ μ—†λ‹€λ©΄ undefinedλ₯Ό λ°˜ν™˜ν•œλ‹€.
const instructors = [
{ name: '승민', libraries: ['λ―Έλ””μ–΄κ΅μœ‘μ •λ³΄ λ„μ„œκ΄€'] },
{ name: '닀인', libraries: ['기념 λ„μ„œκ΄€', 'λ¬Έν—Œμ •λ³΄ν•™ λ„μ„œκ΄€'] },
{ name: 'ν•˜λž‘', libraries: ['쀑앙 λ„μ„œκ΄€'] },
];
  • μœ„μ˜ instructors 배열에 기념 λ„μ„œκ΄€μΈ μ‚¬μ„œλ₯Ό μ°ΎκΈ° μœ„ν•œ for 문으둜 μž‘μ„±ν•œ 방법.
let memorialInstructor;
for(let i = 0; i < instructors.length; i++) {
if(instructors[i].libraries.includes('기념 λ„μ„œκ΄€')) {
memorialInstructor = instructors[i];
break;
}
}
  • find() λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•œ 방법
const librarian = instructors.find(instructor => {
return instructor.libraries.includes('기념 λ„μ„œκ΄€');
});
  • find() λ©”μ„œλ“œμ˜ μœ μΌν•œ 단점은 λ°˜ν™˜κ°’μ„ ν™•μ‹ ν•  수 μ—†λ‹€λŠ” 점이닀.
  • filter() λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ 빈 배열이 λ°˜ν™˜λ˜μ§€λ§Œ find() λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ undefinedκ°€ λ°˜ν™˜λœλ‹€.
  • κ·Έλ ‡μ§€λ§Œ 단락 평가λ₯Ό μ΄μš©ν•˜λ©΄ 기본값을 μΆ”κ°€ν•΄μ„œ μΌμΉ˜ν•˜λŠ” ν•­λͺ©μ΄ 없을 λ•Œ μ‚¬μš©ν•  수 μžˆλ‹€.
const images = [{
path: './me.jpg',
profile: false,
}];

const profile = images.find(image => image.profile) || {
path: './default.jpg'
};
// {path: "./default.jpg"}
  • find() λ©”μ„œλ“œμ˜ ν•œ 가지 μ•„μ‰¬μš΄ 점은 λ„μ„œκ΄€ 이름인 기념 λ„μ„œκ΄€μ„ ν•˜λ“œ μ½”λ”©ν•΄μ•Ό ν•œλ‹€λŠ” 점이닀.
  • λ°°μ—΄ λ©”μ„œλ“œμ˜ 콜백 ν•¨μˆ˜λŠ” μΈμˆ˜κ°€ ν•˜λ‚˜λΏμ΄λΌλŠ” λ¬Έμ œκ°€ 있기 λ•Œλ¬Έμ— 검사 λŒ€μƒμΈ ν•­λͺ© ν•˜λ‚˜λ§Œ 인수둜 받을 수 μžˆλ‹€.
  • 쑰건에 μΌμΉ˜ν•˜λŠ”μ§€ 확인할 λ³€μˆ˜κ°€ ν•„μš”ν•΄μ„œ 두 번째 인수λ₯Ό μΆ”κ°€ν•΄μ•Ό ν•  λ•Œ λ¬Έμ œκ°€ λ°œμƒν•œλ‹€.
  • 이런 κ²½μš°μ— μ»€λ§μ΄λΌλŠ” 기법을 ν™œμš©ν•˜λ©΄ 인수의 수λ₯Ό ν•˜λ‚˜λ‘œ 쀄일 수 μžˆλ‹€.
const findByLibrary = library => instructor => {
return instructor.libraries.includes(library);
};

const librarian = instructors.find(findByLibrary('λ―Έλ””μ–΄κ΅μœ‘μ •λ³΄ λ„μ„œκ΄€'));
// {name: "승민", libraries: ["λ―Έλ””μ–΄κ΅μœ‘μ •λ³΄ λ„μ„œκ΄€"]}

🎯 forEach()둜 λ™μΌν•œ λ™μž‘μ„ μ μš©ν•˜λΌ.​

  • forEach()λŠ” μž…λ ₯ 배열을 μ „ν˜€ λ³€κ²½ν•˜μ§€ μ•Šκ³ , λͺ¨λ“  ν•­λͺ©μ— λ™μΌν•œ λ™μž‘μ„ μˆ˜ν–‰ν•œλ‹€.
const sailingClub = [
'seung',
'min',
'Dain',
'Harang',
'jessi',
'alex',
];
  • μœ„μ˜ sailingClub을 for 문을 μ‚¬μš©ν•œ 방법.
for(let i = 0; i < sailingClub.length; i++) {
sendEmail(sailingClub[i]);
}
  • ꡳ이 forEach()λ₯Ό μ‚¬μš©ν•˜λŠ” κ°€μΉ˜ μžˆλŠ” μ΄μœ λŠ” λ‹€λ₯Έ λ©”μ„œλ“œμ²˜λŸΌ μ½”λ“œλ₯Ό λ‹¨μˆœν•˜κ²Œ λ§Œλ“€κΈ° λ•Œλ¬Έμ΄ μ•„λ‹ˆλΌ, κ·Έλ³΄λ‹€λŠ” 예츑 κ°€λŠ₯ν•˜λ©΄μ„œλ„ λ‹€λ₯Έ λ°°μ—΄ λ©”μ„œλ“œμ™€ 같이 μž‘λ™ν•΄ ν•¨κ»˜ μ—°κ²°ν•  수 있기 λ•Œλ¬Έμ— κ°€μΉ˜κ°€ μžˆλŠ” 것이닀.
  • μ•„λž˜ μ½”λ“œμ™€ 같이 forEach() λ©”μ„œλ“œλŠ” λΆ€μˆ˜ 효과 μ—†μ΄λŠ” 아무 μ†Œμš©μ΄ μ—†κΈ° λ•Œλ¬Έμ— 싀행해도 μ•„λ¬΄λŸ° λ³€ν™”κ°€ μ—†λ‹€.
const names = ['walter', 'white'];
const capitalized = names.forEach(name => name.toUpperCase());

capitalized; // undefined
  • μ•„λž˜ 예제 μ½”λ“œμ²˜λŸΌ capitalized 배열을 λ‘¬μ„œ λŒ€λ¬Έμžλ‘œ λ³€κ²½ν•œ κ²°κ³Όλ₯Ό 담을 수 있게 ν•  수 μžˆμ§€λ§Œ, 배열을 직접 μ‘°μž‘ν•˜λŠ” 방식은 쒋지 λͺ»ν•˜κ³ , μ΄λŸ¬ν•œ μž‘μ—…μ€ map() λ©”μ„œλ“œλ‘œ μ²˜λ¦¬ν•  수 있기 λ•Œλ¬Έμ— forEach() λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  ν•„μš”κ°€ μ—†λ‹€.
const names = ['walter', 'white'];
let capitalized = [];
names.forEach(name => capitalized.push(name.toUpperCase()));

capitalized; // ["WALTER", "WHITE"]
  • κ·Έλ ‡κΈ° λ•Œλ¬Έμ— forEach() λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 곳은 ν•¨μˆ˜μ˜ 유효 λ²”μœ„λ₯Ό λ²—μ–΄λ‚˜λŠ” μž‘μ—…μ΄ ν•„μš”ν•œ κ²½μš°μ΄λ‹€.
  • 즉, λ°˜λ“œμ‹œ λΆ€μˆ˜ νš¨κ³Όκ°€ ν•„μš”ν•œ κ²½μš°μ— forEach()λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.
sailingClub.forEach(member => sendEmail(member));
  • κ²°κ΅­ forEach()λ₯Ό μ‚¬μš©ν•˜λŠ” κ°€μž₯ 큰 μš”μ μ€ μ•½κ°„μ˜ 예츑 κ°€λŠ₯성을 얻을 수 μžˆλ‹€λŠ” κ²ƒμœΌλ‘œ forEach() λ©”μ„œλ“œκ°€ μžˆλ‹€λ©΄ λΆ€μˆ˜ 효과λ₯Ό λ°œμƒν•œλ‹€λŠ” 점이닀.
  • κ°€μž₯ 큰 μ΄μœ λŠ” 체이닝 κ³Όμ •μ—μ„œ λ‹€λ₯Έ λ°°μ—΄ λ©”μ„œλ“œμ™€ κ²°ν•©ν•  수 있기 λ•Œλ¬Έμ΄λ‹€.

🎯 μ²΄μ΄λ‹μœΌλ‘œ λ©”μ„œλ“œλ₯Ό μ—°κ²°ν•˜λΌ.​

  • 체이닝(method-chaining)은 값을 λ‹€μ‹œ ν• λ‹Ήν•˜μ§€ μ•Šκ³  λ°˜ν™˜λœ 객체에 λ©”μ„œλ“œλ₯Ό μ¦‰μ‹œ ν˜ΈμΆœν•˜λŠ” 것을 μ˜λ―Έν•œλ‹€.
const sailors = [
{
name: 'seungmin',
active: true,
email: 'seungmin@naver.com',
},
{
name: 'dain',
active: true,
email: '',
},
{
name: 'harang',
active: false,
email: '',
},
];
  • μœ„ sailors배열을 μ΄μš©ν•΄ ν™œλ™μ΄ μ—†λŠ” νšŒμ›μ„ μ œμ™Έν•΄ 보자.
const active = sailors.filter(sailor => sailor.active);
// [
// {name: "seungmin", active: true, email: "seungmin@naver.com"},
// {name: "dain", active: true, email: ""}
// ]
  • 이메일 μ£Όμ†Œλ₯Ό νšŒμ›μ΄ 이메일을 가지고 있으면 ν•΄λ‹Ή 이메일을 μ‚¬μš©ν•˜κ³ , 그렇지 μ•ŠμœΌλ©΄ κΈ°λ³Έ 이메일을 μ‚¬μš©ν•œλ‹€.
const emails = active.map(member => member.email || `${member.name}@naver.com`);
// ["seungmin@naver.com", "dain@naver.com"]
  • μ •ν™•ν•œ νšŒμ› 정보λ₯Ό μ΄μš©ν•΄ sendEmail ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  수 μžˆλ‹€.
emails.forEach(sailor => sendEmail(sailor));
  • μœ„μ˜ μ½”λ“œλ“€μ„ 체이닝을 μ‚¬μš©ν•˜μ—¬ 쀑간 단계λ₯Ό μ œκ±°ν•˜κ³  λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜μ§€ μ•Šκ³ λ„ λ™μΌν•œ μž‘μ—…μ„ μ²˜λ¦¬ν•  수 μžˆλ‹€.
sailors
.filter(sailor => sailor.active)
.map(member => member.email || `${member.name}@naver.com`)
.forEach(sailor => sendEmail(sailor));
  • λ©”μ„œλ“œ 체이닝을 μ‚¬μš©ν•  λ•Œ 주의 사항은 λ§ˆμ§€λ§‰ λ¬Έμž₯κΉŒμ§€ μ„Έλ―Έμ½œλ‘ μ΄ μ—†λŠ” 것을 확인해야 ν•œλ‹€.
  • ν•œ 가지 더 μ€‘μš”ν•œ 점은 μˆœμ„œλ₯Ό μ§€μΌœμ•Ό ν•œλ‹€λŠ” 점이닀.

🎯 reduce()둜 λ°°μ—΄ 데이터λ₯Ό λ³€ν™˜ν•˜λΌ.​

  • λ°°μ—΄ λ©”μ„œλ“œκ°€ ν›Œλ₯­ν•œ μ΄μœ λŠ” 콜백 ν•¨μˆ˜λ₯Ό μ΄ν•΄ν•˜κΈ° 전에도 결괏값을 ν•œλˆˆμ— μ˜ˆμΈ‘ν•  수 있기 λ•Œλ¬Έμ΄λ‹€.
  • κ²Œλ‹€κ°€, λ°°μ—΄ λ©”μ„œλ“œλŠ” ν…ŒμŠ€νŠΈν•˜κΈ° 쉽닀.
  • reduce() λ©”μ„œλ“œλŠ” 배열을 μ΄μš©ν•΄μ„œ 근본적으둜 λ‹€λ₯Έ μƒˆλ‘œμš΄ 데이터λ₯Ό λ§Œλ“€μ–΄μ•Ό ν•  κ²½μš°λ‚˜ νŠΉμ • ν•­λͺ©μ˜ μˆ˜κ°€ ν•„μš”ν•˜κ±°λ‚˜, 배열을 객체처럼 λ‹€λ₯Έ ν˜•νƒœμ˜ 자료ꡬ쑰둜 λ³€ν™˜ν•΄μ•Ό ν•˜λŠ” κ²½μš°μ— μ‚¬μš©λœλ‹€.
  • reduce() λ©”μ„œλ“œλ§Œμ˜ κ°€μž₯ μ€‘μš”ν•œ νŠΉμ§•μ€ λ°°μ—΄μ˜ 길와 데이터 ν˜•νƒœλ₯Ό λͺ¨λ‘ λ˜λŠ” 각각 λ³€κ²½ν•  수 μžˆλ‹€λŠ” 점이닀.
  • λ˜ν•œ, reduce() λ©”μ„œλ“œλŠ” λ°˜λ“œμ‹œ 배열을 λ°˜ν™˜ν•  ν•„μš”λ„ μ—†λ‹€.
  • μ•„λž˜ μ½”λ“œλŠ” reduce() λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•΄μ„œ λ™μΌν•œ 배열을 λ°˜ν™˜ν•œ 것이닀.
// reduce() λ©”μ„œλ“œμ˜ 콜백 ν•¨μˆ˜μ— 두 개의 인수λ₯Ό μ „λ‹¬ν•œλ‹€.
// collectedValues λ°˜ν™˜λ˜λŠ” ν•­λͺ©
// item κ°œλ³„ ν•­λͺ©
const callback = function (collectedValues, item) {
// λ°˜ν™˜κ°’μ€ 콜백 ν•¨μˆ˜κ°€ λ°˜ν™˜ν•˜λŠ” 값을 λˆ„μ ν•œ 것
return [...collectedValues, item];
};

const saying = ['veni', 'vedi', 'veci'];
const initialValue = [];
const copy = saying.reduce(callback, initialValue); // ["veni", "vedi", "veci"]
  • reduce() λ©”μ„œλ“œκ°€ νŠΉλ³„ν•œ μ΄μœ λŠ” λ°˜ν™˜κ°’μ€ μ •μˆ˜λΏ μ•„λ‹ˆλΌ μ„ΈνŠΈ 같은 μ»¬λ ‰μ…˜λ„ 될 수 μžˆλ‹€.
  • reduce() λ©”μ„œλ“œμ˜ 두 가지 κ°’, 즉 콜백 ν•¨μˆ˜μ™€ 기본값을 μ „λ‹¬λ°›λŠ”λ‹€.
  • 기본값은 μƒλž΅ν•  μˆ˜λ„ μžˆμ§€λ§Œ λŒ€λΆ€λΆ„ μž‘μ„±ν•˜μ—¬ λ°˜ν™˜κ°’μ„ 담을 수 μžˆλ‹€.
  • reduce() λ©”μ„œλ“œμ—μ„œ κΉŒλ‹€λ‘œμš΄ 뢀뢄은 콜백 ν•¨μˆ˜μ—μ„œ 항상 λˆ„μ λœ 값을 λ°˜ν™˜ν•΄μ•Ό ν•œλ‹€λŠ” 점이닀.
const dogs = [
{ name: '토이 ν‘Έλ“€', color: 'κ°ˆμƒ‰' },
{ name: 'λž˜λΈŒλΌλ„λ ˆνŠΈλ¦¬λ²„', color: '흰색' },
{ name: 'ν¬λ©”λ¦¬μ•ˆ', color: '흰색' },
]
  • μœ„ dogs 배열을 μ‚¬μš©ν•˜μ—¬ reduce()둜 κ³ μœ³κ°’μ΄ λ‹΄κΈ΄ 집합을 λ§Œλ“€μ–΄ 보자.
const colors = dogs.reduce((colors, dog) => {
if(colors.includes(dog['color'])) {
return colors;
}
return [...colors, dog['color']];
}, []);
// ["κ°ˆμƒ‰", "흰색"]
  • reduce() λ©”μ„œλ“œλ₯Ό νŒŒμ•…ν•˜κΈ° μœ„ν•œ 또 λ‹€λ₯Έ μ€‘μš”ν•œ μš”μ†ŒλŠ” μ΄ˆκΉƒκ°’μ΄ ν•¨μˆ˜μ— μ „λ‹¬λœ ν›„ μ–΄λ–»κ²Œ λΆˆλ¦¬λŠ”μ§€λ₯Ό μ΄ν•΄ν•˜λŠ” κ²ƒμœΌλ‘œ 보톡 **캐리(carry)**라고 λΆ€λ₯΄μ§€λ§Œ, 단지 λ§€κ°œλ³€μˆ˜μ΄κΈ° λ•Œλ¬Έμ— μ›ν•˜λŠ” λŒ€λ‘œ 이름을 뢙일 수 μžˆλ‹€. (μ—¬κΈ°μ„œλŠ” colors)
  • ν•¨μˆ˜ λͺΈμ²΄λ₯Ό μ‚΄νŽ΄λ³΄μ§€ μ•Šμ•„λ„, λ‹€λ₯Έ 배열이 λ°˜ν™˜λœλ‹€λŠ” 점은 이미 μ•Œ 수 있기 λ•Œλ¬Έμ— 항상 λˆ„μ κ°’μ„ λͺ…μ‹œμ μœΌλ‘œ μž‘μ„±ν•΄μ•Ό ν•œλ‹€.
  • λ˜ν•œ, μ£Όμ˜ν•  점은 λˆ„μ κ°’μ„ λ°˜ν™˜ν•˜μ§€ μ•ŠμœΌλ©΄ 값은 μ™„μ „νžˆ 사라진닀.
const colors = dogs.reduce((colors, dog) => {
if(colors.includes(dog['color'])) {
return colors;
}
[...colors, dog['color']];
}, []);
// Uncaught TypeError: Cannot read property 'includes' of undefined
  • reduce() λ©”μ„œλ“œλŠ” λ°μ΄ν„°μ˜ 크기와 ν˜•νƒœλ₯Ό λͺ¨λ‘ λ³€κ²½ν•  수 있기 λ•Œλ¬Έμ— λ‹€λ₯Έ λ°°μ—΄ λ©”μ„œλ“œλ₯Ό λ‹€μ‹œ λ§Œλ“€ μˆ˜λ„ μžˆλ‹€.
  • μ•„λž˜ μ½”λ“œλŠ” μƒ‰μƒλ§Œ λͺ¨μ„ λ•Œ map() λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.
const colors = dogs.map(dog => dog['color']); // ["κ°ˆμƒ‰", "흰색", "흰색"]
  • reduce() λ©”μ„œλ“œλ₯Ό μ΄μš©ν•΄μ„œ 같은 κ²°κ³Όλ₯Ό 얻을 수 μžˆλ‹€.
const colors = dogs.reduce((colors, dog) => {
return [...colors, dog['color']];
},[]);
// ["κ°ˆμƒ‰", "흰색", "흰색"]
  • map()μœΌλ‘œλ„ 결과값을 κ°™κ²Œ ν•  수 μžˆλŠ”λ° κ³ μœ κ°’μ„ 뢄리할 λ•Œ reduce()λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” μ΄μœ λŠ” λ¦¬λ“€μ„œ(reducer)κ°€ 더 λ§Žμ€ 값을 μ‰½κ²Œ λ‹€λ£° 수 μžˆλ„λ‘ μ½”λ“œμ— μœ μ—°μ„±μ„ μ œκ³΅ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.
const filters = dogs.reduce((filters, item) => {
filters.breed.add(item['name']);
filters.color.add(item['color']);
return filters;
},
{
breed: new Set(),
color: new Set(),
});
  • filters κ²°κ³Όκ°’

chapter5-1;

  • λ°μ΄ν„°μ˜ 크기와 ν˜•νƒœλ₯Ό λ™μ‹œμ— λ°”κΏ€ 수 μžˆμœΌλ―€λ‘œ μ‚¬μš© 방법이 λ¬΄κΆλ¬΄μ§„ν•˜λ‹€.
const developers = [
{ name: 'sa', language: 'javascript' },
{ name: 'seungmin', language: 'typescript' },
{ name: 'dain', language: 'java' },
{ name: 'harang', language: 'javascript' },
];
  • μœ„ developers λ°°μ—΄λ‘œ reduce() μ–Έμ–΄λ³„λ‘œ λͺ‡ λͺ…인지 확인할 수 μžˆλ‹€.
const aggregated = developers.reduce((specialities, developer) => {
const count = specialities[developer.language] || 0;
return {
...specialities,
[developer.language]: count + 1,
};
},{});
// {javascript: 2, typescript: 1, java: 1}

🎯 for...in λ¬Έκ³Ό for...of 문으둜 λ°˜λ³΅λ¬Έμ„ μ •λ¦¬ν•˜λΌ.​

  • for...of 문을 μ΄μš©ν•΄μ„œ 객체에 λŒ€ν•œ λ°˜λ³΅λ¬Έμ„ 톡해 반볡문의 λͺ…λ£Œμ„±μ„ μœ μ§€ν•  수 μžˆλ‹€.
  • for...in 문을 μ΄μš©ν•΄μ„œ μ΄ν„°λŸ¬λΈ”μ— λŒ€ν•œ λ°˜λ³΅λ¬Έμ„ μ‚¬μš©ν•  수 μžˆλ‹€.
  • 에어비앀비(Airbnb)의 μŠ€νƒ€μΌ κ°€μ΄λ“œλŠ” 항상 λ°°μ—΄ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜κ³  for...of λ¬Έκ³Ό for...in 문의 μ‚¬μš©μ„ μ œν•œν•΄μ•Ό ν•œλ‹€κ³  μ£Όμž₯ν•œλ‹€. (μ°Έκ³ )
  • κ·Έλ ‡μ§€λ§Œ λͺ¨λ“  μ‚¬λžŒμ΄ 이에 λ™μ˜ν•˜μ§€λŠ” μ•ŠλŠ”λ‹€. λ•Œλ‘œλŠ” 자료ꡬ쑰λ₯Ό λ°°μ—΄λ‘œ λ³€ν™˜ν•˜λŠλΌ κ³ μƒν•˜λŠ” κ²ƒλ³΄λ‹€λŠ” λ‹€λ₯Έ 방법을 μ°Ύμ•„λ³΄λŠ” 것이 λ‚˜μ„ μˆ˜λ„ μžˆλ‹€.
  • μ•„λž˜ 예제 μ½”λ“œλŠ” 맡을 μ‚¬μš©ν•΄μ„œ μ‚¬μš©μžκ°€ μ˜΅μ…˜μ„ 클릭할 λ•Œ λ‹€μ–‘ν•œ νšŒμ‚¬λ₯Ό 담은 것이고, 정보λ₯Ό κ³„μ†ν•΄μ„œ μΆ”κ°€ν•˜κ³  μ‚­μ œν•˜λŠ” μž‘μ—…μ΄λ―€λ‘œ 맡을 μ‚¬μš©ν•˜λ©΄ μ‰½κ²Œ μ²˜λ¦¬ν•  수 μžˆλ‹€.
const firms = new Map()
.set(10, 'Ivie Group')
.set(23, 'Soundscaping Source')
.set(31, 'Big 6');
  • μ‚¬μš©μžμ‚¬ μ„ νƒν•œ νšŒμ‚¬λ₯Ό μˆœνšŒν•˜λ©΄μ„œ μ΄μš©ν•  수 μžˆλŠ” νšŒμ‚¬μΈμ§€ ν™•μΈν•œλ‹€.(λ‹€λ₯Έ κ³³μ—μ„œ μ •μ˜ν•œ isAvailabel() ν•¨μˆ˜λ₯Ό μ‚¬μš©.)
const entries = [...firms];
for(let i = 0; i < entries.length; i++){
const [id, name] = entries[i];
if(!isAvailable(id)) {
return `${name}λŠ” μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€.`;
}
}
return 'λͺ¨λ“  νšŒμ‚¬λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.';
  • μœ„ for 문으둜 λ˜μ–΄μžˆλŠ” λ°˜λ³΅λ¬Έμ„ find() λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•΄μ„œ μ„œλΉ„μŠ€λ₯Ό μ œκ³΅ν•˜μ§€ λͺ»ν•˜λŠ” νšŒμ‚¬κ°€ μžˆλŠ”μ§€ 확인할 수 μžˆλ‹€.
const unavailable = [...firms].find(firm => {
const [id] = firm;
return !isAvailable(id);
});
if(unavailable) {
return `${unavailable[1]}λŠ” μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€.`;
}
return 'λͺ¨λ“  νšŒμ‚¬λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.';
  • reduce() λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•΄μ„œ λ©”μ‹œμ§€λ₯Ό λ°˜ν™˜ν•  μˆ˜λ„ μžˆλ‹€.
const message = [...firms].reduce((availability, firm) => {
const [id, name] = firm;
if(!isAvailable(id)) {
return `${name}λŠ” μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€.`;
}
return availability;
},'λͺ¨λ“  νšŒμ‚¬λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.');
return message;
  • 이 방법듀은 λ¬Έμ œκ°€ λ˜λŠ” 뢀뢄이 μžˆλ‹€. find() λ©”μ„œλ“œλ₯Ό μ΄μš©ν•˜λ©΄ μ΄μš©ν•  수 μ—†λŠ” νšŒμ‚¬κ°€ μžˆλŠ”μ§€ ν™•μΈν•˜κ³  λ©”μ‹œμ§€λ₯Ό λ°˜ν™˜ν•˜λŠ” 두 단계λ₯Ό 거쳐야 ν•˜κ³  reduce() λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ μ½”λ“œλ₯Ό μ΄ν•΄ν•˜κΈ° μ’€ μ–΄λ ΅λ‹€.
  • λ˜ν•œ, find() λ©”μ„œλ“œλŠ” 이용이 λΆˆκ°€λŠ₯ν•œ νšŒμ‚¬ 쀑 첫 번째 νšŒμ‚¬λ§Œ 찾을 수 있고, reduce() λ©”μ„œλ“œλŠ” λ§ˆμ§€λ§‰ νšŒμ‚¬λ§Œ 찾을 수 μžˆλ‹€.
  • 맡은 펼침 μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•  수 있게 ν•΄μ£ΌλŠ” 맡 μ΄ν„°λ ˆμ΄ν„°λΌλŠ” 속성이 μ‘΄μž¬ν–ˆλŠ”λ°, 이 속성이 맡을 직접 μˆœνšŒν•  수 있게 ν•΄μ€€λ‹€.
  • κ·Έλ ‡κΈ° λ•Œλ¬Έμ— for...of 문으둜 μ΄ν„°λ ˆμ΄ν„°λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.
for(const firm of firms) {
const [id, name] = firm;
if(!isAvailable(id)) {
return `${name}λŠ” μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€.`;
}
}
return 'λͺ¨λ“  νšŒμ‚¬λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.';
  • for...of 문은 반볡문으둜 무엇이든 ν•  수 있기 λ•Œλ¬Έμ— 예츑 κ°€λŠ₯성이 μ€„μ–΄λ“œλŠ” λ¬Έμ œκ°€ μžˆλ‹€.
  • μ»¬λ ‰μ…˜μ„ μˆœνšŒν•  λ•Œ ν”νžˆ λ²Œμ–΄μ§€λŠ” μ»¬λ ‰μ…˜ μ‘°μž‘λ§Œ ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄, 예츑 κ°€λŠ₯성이 μ€„μ–΄λ“œλŠ” 것은 이 λ°©μ‹μ˜ μœ μΌν•œ λ¬Έμ œμ΄λ‹€.
  • for...of 문은 λ°˜λ“œμ‹œ ν•„μš”ν•œ κ²½μš°μ—λ§Œ μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€.
  • for...in 문은 for...of λ¬Έκ³Ό 맀우 μœ μ‚¬ν•˜λ‹€.
  • for...in 문은 객체에 ν•„μš”ν•œ μž‘μ—…μ„ 직접 μ‹€ν–‰ν•˜κΈ° λ•Œλ¬Έμ— Object.key()λ₯Ό μ‹€ν–‰ν•΄μ„œ 객체의 ν‚€λ₯Ό λ°°μ—΄λ‘œ λ³€ν™˜ν•˜λŠ” 과정을 μƒλž΅ν•  수 μ—†λ‹€. 더 μ •ν™•νžˆ λ§ν•˜λ©΄ 객체의 속성을 μˆœνšŒν•œλ‹€.
  • κ°μ²΄λŠ” ν”„λ‘œν† νƒ€μž… 체인에 μžˆλŠ” λ‹€λ₯Έ κ°μ²΄μ—μ„œ 속성을 상속받고, κ°μ²΄μ—λŠ” μ—΄κ±°ν•  수 μ—†λŠ” 속성이 μžˆμ–΄ μˆœνšŒμ—μ„œ μ œμ™Έλ˜κΈ°λ„ ν•œλ‹€.
  • 즉, 객체의 속성은 λ‹¨μˆœν•˜μ§€ μ•Šλ‹€. (MDNμ—μ„œ 자체 μ†μ„±λ§Œ 반볡 μ°Έκ³ )
  • κ·Έλ ‡κΈ° λ•Œλ¬Έμ— 맡을 객체둜 λ³€κ²½ν•΄ μ€€λ‹€.
const firms = {
'10': 'Ivie Group',
'23': 'Soundscaping Source',
'31': 'Big 6',
};
  • for...in 문을 μ‚¬μš©ν•΄μ„œ λ³€κ²½ν•  수 μžˆλ‹€.
for(const id in firms) {
if(!isAvailable(parseInt(id, 10))) {
return `${firms[id]}λŠ” μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€.`;
}
}
return 'λͺ¨λ“  νšŒμ‚¬λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.';
  • for...in문도 λ§ˆμ°¬κ°€μ§€λ‘œ 무쑰건적으둜 μ‚¬μš©ν•˜μ§€ 말고 μ‚¬μš©μ΄ μ μ ˆν•œ κ²½μš°μ—λ§Œ μ„ νƒν•˜λŠ” 것이 μ’‹λ‹€.
  • ν‚€λ§Œ ν•„μš”ν•œ κ²½μš°μ—λŠ” λ°°μ—΄ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜κΈ° 전에 Object.key()둜 ν‚€λ₯Ό κ°€μ Έμ˜€λŠ” 것이 더 λ‚˜μ„ μˆ˜λ„ μžˆλ‹€.
  • κ°’λ§Œ ν•„μš”ν•œ κ²½μš°λ„ λ§ˆμ°¬κ°€μ§€λ‘œ Object.value()λ₯Ό μ‚¬μš©ν•œλ‹€.
  • μ—¬κΈ°μ„œ 더 μ£Όμ˜ν•΄μ•Ό ν•  사항은 객체λ₯Ό μˆœνšŒν•˜λ©΄μ„œ 객체λ₯Ό μ‘°μž‘ν•˜λ©΄ μ•ˆ λœλ‹€.
  • 객체λ₯Ό μ‘°μž‘ν•˜λŠ” 것은 맀우 μœ„ν—˜ν•˜κ³ , 특히 반볡 쀑인 속성 μ™Έμ˜ λ‹€λ₯Έ 속성을 μΆ”κ°€ν•˜κ±°λ‚˜ μˆ˜μ •ν•˜λŠ” κ²½μš°μ—λŠ” 버그가 λΉ λ₯΄κ²Œ 퍼질 수 μžˆλ‹€.