with JavaScripts Study Days 3-4

with JavaScripts Study Days 3-4

# 1~2일차 볡슡

  • μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ λͺ¨λ“  ν•¨μˆ˜μ˜ νŒŒλΌλ―Έν„°λŠ” κ°’μœΌλ‘œ μ „λ‹¬λ˜λ©°(call by value) 레퍼런슀 μ „μš© νŒŒλΌλ―Έν„°λŠ” μ—†λ‹€. ν•˜μ§€λ§Œ λ°°μ—΄μ²˜λŸΌ 객체 레퍼런슀λ₯Ό ν•¨μˆ˜ νŒŒλΌλ―Έν„°λ‘œ μ‚¬μš©ν•  λ•ŒλŠ” 레퍼런슀둜 μ „λ‹¬λœλ‹€.
  • JSλŠ”Β κΈ°λ³Έ νƒ€μž…(number, string, boolean, null, undefined)을 μ œμ™Έν•œ λͺ¨λ“  값이 '객체'이닀. λ”°λΌμ„œ λ°°μ—΄, ν•¨μˆ˜, μ •κ·œν‘œν˜„μ‹ λ“± λͺ¨λ‘ 객체둜 ν‘œν˜„λœλ‹€. 이것은 객체의 λͺ¨λ“  연산이 μ‹€μ œ 값이 μ•„λ‹Œ μ°Έμ‘°κ°’μœΌλ‘œ 처리되기 λ•Œλ¬Έμ΄λ‹€.
  • κΈ°λ³Έ νƒ€μž…κ³Ό μ°Έμ‘° νƒ€μž…μ˜ κ²½μš°λŠ” ν•¨μˆ˜ 호좜 방식도 λ‹€λ₯΄λ‹€. κΈ°λ³Έ νƒ€μž…μ€ call by value둜 λ™μž‘ν•œλ‹€. ν•¨μˆ˜μ˜ 인자둜 κΈ°λ³Έ νƒ€μž…μ΄ λ„˜κ²¨μ§ˆ 경우, ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜λ‘œ λ³΅μ‚¬λœ 값이 μ „λ‹¬λœλ‹€. λ”°λΌμ„œ ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ λ§€κ°œλ³€μˆ˜λ₯Ό μ΄μš©ν•΄ 값을 변경해도, μ‹€μ œλ‘œ 호좜된 λ³€μˆ˜μ˜ 값이 λ³€κ²½λ˜μ§€λŠ” μ•ŠλŠ”λ‹€.
반면, 객체와 같은 μ°Έμ‘° νƒ€μž…μ˜ 경우, ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œ call by reference(ν‹€λ¦Ό!)둜 λ™μž‘ν•œλ‹€. 즉, ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œ, 객체의 참쑰값이 μ „λ‹¬λ˜κ³  ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ 참쑰값을 μ΄μš©ν•΄ 인자둜 λ„˜κΈ΄ μ‹€μ œ 객체의 값을 λ³€κ²½ν•  수 μžˆλ‹€.
  • >Β JSμ—μ„œ call by referenceκ°€ ν‹€λ¦° 이유?
JSλŠ” 항상 call by valueλ‹€. μ™œλƒν•˜λ©΄ cbr이 λΆˆμ™„μ „ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.
function foo(obj2) {
  obj2= 10;
  console.log(obj2);// 10
}
let obj1 = { a: 5, b: 8 };
foo(obj1);
console.log(obj1);// C, C++μ—μ„œλŠ” 10 / JSλŠ” { a: 5, b: 8 } 좜λ ₯!!
cλ‚˜ c++ 같은 μ–Έμ–΄μ—μ„œ 포인터λ₯Ό 예둜 λ“€λ©΄, ν•¨μˆ˜ λ‚΄μ—μ„œ obj2 = 10;을 ν•˜λŠ” 경우 obj1의 값이 10이 λœλ‹€. μ™„μ „ν•œ μ£Όμ†Œκ°’ 참쑰둜 λ˜μ–΄ 있기 λ•Œλ¬Έμ΄λ‹€.
ν•˜μ§€λ§ŒΒ JS의 κ²½μš°μ—λŠ” 객체의 ν”„λ‘œνΌν‹° 값이 μ•„λ‹ŒΒ κ°μ²΄ 자체의 변경을 ν—ˆμš©ν•˜μ§€ μ•ŠλŠ”λ‹€.Β μ™œλƒν•˜λ©΄ κ²‰λ³΄κΈ°μ—λŠ” μ£Όμ†Œκ°’μ„ μ°Έμ‘°ν•˜λŠ” 것 κ°™μ§€λ§Œ μ‹€μ œλ‘œλŠ” μ£Όμ†Œκ°’μ˜ 볡사본을 λ§Œλ“€μ–΄μ„œ λ„˜κΈ°κΈ° λ•Œλ¬Έμ΄λ‹€.
notion image
https://velog.io/@leo-xee/JS-Call-by-value-reference
μ΄μ²˜λŸΌΒ ν•¨μˆ˜ λ‚΄λΆ€μ˜Β obj2 = 10;μ—μ„œΒ obj2의 μ£Όμ†Œκ°’μ΄Β 10이 μ €μž₯된 μœ„μΉ˜μ˜ μ£Όμ†Œκ°’μœΌλ‘œ λ³€κ²½λœλ‹€. 결둠적으둜 두 κ°μ²΄λŠ” λ‹€λ₯Έ 객체이닀. λ•Œλ¬Έμ— JSλŠ”Β call by sharingμ΄λΌλŠ” μš©μ–΄λ₯Ό μ‚¬μš©ν•˜κΈ°λ„ ν•œλ‹€.
  • var ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜λ©΄ ν•¨μˆ˜ 내에 μ„ μ–Έν•˜λ”λΌλ„ κ·Έ λ³€μˆ˜λŠ” μžλ™μœΌλ‘œ μ „μ—­ λ²”μœ„λ₯Ό κ°–λŠ”λ‹€. ν•¨μˆ˜μ—μ„œ μ„ μ–Έν•œ λ³€μˆ˜κ°€ 메인 ν”„λ‘œκ·Έλž¨μ— μžˆλŠ” μ „μ—­ λ³€μˆ˜μ˜ 값을 λ³€κ²½ν•˜κ²Œ λœλ‹€.(var : function scope / const, let : block scope)
  • JSμ—μ„œλŠ” λ³€μˆ˜ λ²”μœ„κ°€ ν•¨μˆ˜ λ²”μœ„κ³  블둝 λ²”μœ„κ°€ μ§€μ›λ˜μ§€ μ•ŠλŠ”λ‹€κ³  ν–ˆμœΌλ‚˜ ES6(ES2015)μ—μ„œ let, constκ°€ μ§€μ›λ˜λ©΄μ„œ κ°€λŠ₯ν•΄μ‘Œλ‹€.
"let은 λ³€μˆ˜κ°€ μ„ μ–Έλœ 블둝, ꡬ문 λ˜λŠ” ν‘œν˜„μ‹ λ‚΄μ—μ„œλ§Œ μœ νš¨ν•œ λ³€μˆ˜λ₯Ό μ„ μ–Έν•œλ‹€. μ΄λŠ” var ν‚€μ›Œλ“œκ°€ 블둝 λ²”μœ„λ₯Ό λ¬΄μ‹œν•˜κ³  μ „μ—­ λ³€μˆ˜λ‚˜ ν•¨μˆ˜ μ§€μ—­λ³€μˆ˜λ‘œ μ„ μ–Έλ˜λŠ” 것과 λ‹€λ₯΄λ‹€."
  • let은 varκ³Ό 달리 λ³€μˆ˜μ˜ μž¬ν• λ‹Ήμ„ ν—ˆμš©ν•˜μ§€ μ•Šμ•„ μž¬ν• λ‹Ή 문제λ₯Ό ν•΄κ²°ν•΄μ€€λ‹€.
notion image
  • κ·Έ 밖에 var은 ν˜Έμ΄μŠ€νŒ…μ΄ μ§€μ›λ˜λŠ”λ° λ³€μˆ˜κ°€ ν•¨μˆ˜ λ‚΄μ—μ„œ μ •μ˜λ˜λ©΄ κ·Έ ν•¨μˆ˜μ˜ μ΅œμƒμœ„λ‘œ, ν•¨μˆ˜ λ°”κΉ₯에 μ •μ˜λœ 경우 μ „μ—­ μ»¨ν…μŠ€νŠΈμ˜ μ΅œμƒμœ„λ‘œ λ³€κ²½λ˜λŠ” 것이닀.
μ½”λ“œμ˜ μˆœμ„œμ™€ 상관 없이 λ³€μˆ˜μ™€ ν•¨μˆ˜ 선언문에 λŒ€ν•œ λ©”λͺ¨λ¦¬λ₯Ό λ¨Όμ € ν™•λ³΄ν•˜λŠ” 것이닀. ν•˜μ§€λ§Œ 값이 ν• λ‹Ήλ˜μ§€λŠ” μ•ŠμœΌλ―€λ‘œ undefinedλ₯Ό 좜λ ₯ν•œλ‹€.
  • κ°μ²΄λŠ” μƒμ„±μž ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄ μ •μ˜ν•œλ‹€. this ν‚€μ›Œλ“œλŠ” 각 ν•¨μˆ˜μ™€ ν”„λ‘œνΌν‹°λ₯Ό 객체 μΈμŠ€ν„΄μŠ€λ‘œ μ—°κ²°ν•˜λŠ” 역할이닀. μ–΄λ–€ 객체의 balance ν”„λ‘œνΌν‹°λ₯Ό μ°Έμ‘°ν•˜λŠ” 것인지 μ•Œ 수 μžˆλ„λ‘ this ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν–ˆλ‹€.
function Checking(amount){
	this.balance = amount;// ν”„λ‘œνΌν‹°this.deposit = deposit;// ν•¨μˆ˜// ...
}

function deposit(amount){
	this.balance += amount;
}

// ...let account = new Checking(500);
account.deposit(1000);

// ...
  • 배열은 μ •μˆ˜ 인덱슀(μ˜€ν”„μ…‹)을 μ΄μš©ν•΄ 각 μš”μ†Œμ— μ ‘κ·Όν•  수 있게 순차적으둜 μš”μ†Œλ₯Ό μ €μž₯ν•œ 집합체닀. JS의 배열은 νŠΉν™”λœ JS 객체이며 μ •μˆ˜ 인덱슀(객체의 ν”„λ‘œνΌν‹°λͺ… μ—­ν• )둜 객체 λ‚΄ 데이터 μ˜€ν”„μ…‹μ„ ν‘œν˜„ν•œλ‹€. μ •μˆ˜λ₯Ό 인덱슀둜 μ‚¬μš©ν•˜λ©΄ λ‚΄λΆ€μ μœΌλ‘œ μ •μˆ˜λ₯Ό λ¬Έμžμ—΄λ‘œ λ³€ν™˜ν•œλ‹€. λ‚΄λΆ€μ μœΌλ‘œλŠ” νŠΉν™”λœ κ°μ²΄μ΄λ―€λ‘œ λ°°μ—΄λ‘œ μ·¨κΈ‰ν•˜λŠ” 것이닀.
  • ν•œ 배열에 λ‹€μ–‘ν•œ μ’…λ₯˜μ˜ μš”μ†Œλ₯Ό 포함할 수 μžˆλ‹€.(λŒ€λΆ€λΆ„ 슀크립트 μ–Έμ–΄κ°€ κ·Έλ ‡λ‹€.)
  • Array.isArray()둜 νŠΉμ • 객체가 배열인지 μ—¬λΆ€λ₯Ό 확인할 수 μžˆλ‹€.
  • JS 배열은 κ°μ²΄μ΄λ―€λ‘œ μ–Έμ œλ“ μ§€ 크기가 λŠ˜μ–΄λ‚  수 μžˆλ‹€. length ν”„λ‘œνΌν‹°λ₯Ό μ‚¬μš©ν•˜λ©΄ ν˜„μž¬ λ°°μ—΄μ˜ μ‹€μ œ μš”μ†Œ μˆ˜κ°€ μ •ν™•νžˆ λ°˜ν™˜λ˜λ―€λ‘œ μ–Έμ œλ‚˜ λ°°μ—΄μ˜ λͺ¨λ“  μš”μ†Œμ— μ ‘κ·Όν•  수 μžˆλ‹€.
  • split() ν•¨μˆ˜λŠ” λ¬Έμžμ—΄μ„ νŠΉμ • κ΅¬λΆ„μž(곡백 λ“±)둜 λΆ„λ¦¬ν•œλ‹€μŒ λΆ„λ¦¬λœ λ¬Έμžμ—΄μ„ ν¬ν•¨ν•˜λŠ” 배열을 λ°˜ν™˜ν•œλ‹€.
  • 배열을 λ‹€λ₯Έ 배열에 ν• λ‹Ήν•  수 μžˆλ‹€. μ΄λŠ”Β ν• λ‹Ήλœ λ°°μ—΄μ˜ 레퍼런슀λ₯Ό ν• λ‹Ήν•˜λŠ” 것이닀. λ”°λΌμ„œ μ›λž˜ 배열을 λ°”κΎΈκ²Œ 되면 ν• λ‹Ήλœ 배열도 바뀐닀. 이λ₯Ό 얕은 볡사(shallow copy)라고 ν•œλ‹€.
  • κΉŠμ€ 볡사(deep copy)λŠ”Β μ›λž˜ λ°°μ—΄ μš”μ†Œλ₯Ό μƒˆλ‘œμš΄ λ°°μ—΄ μš”μ†Œλ‘œ λ³΅μ‚¬ν•˜λŠ” κΈ°λŠ₯이 ν•„μš”ν•  λ•ŒΒ μ“΄λ‹€.
  • μ ‘κ·Όμž ν•¨μˆ˜(accessor function)은 νŠΉμ •κ°’μ„ ν¬ν•¨ν•˜λŠ” κ²°κ³Ό 배열을 λ°˜ν™˜ν•œλ‹€.
  • κ·Έ 쀑 자주 μ“°μ΄λŠ” 것이 indexOf()둜 인자둜 제곡된 값이 배열에 있으면 인덱슀 μœ„μΉ˜λ₯Ό λ°˜ν™˜ν•˜κ³  μ—†μœΌλ©΄ -1을 λ°˜ν™˜ν•œλ‹€. μ—¬λŸ¬ 개면 첫 번째둜 λ°œκ²¬ν•œ 인자의 인덱슀λ₯Ό λ°˜ν™˜ν•œλ‹€.
  • join(), toString() ν•¨μˆ˜λŠ” 배열을 λ¬Έμžμ—΄ ν˜•μ‹μœΌλ‘œ λ°”κΎΌλ‹€. 두 ν•¨μˆ˜ λͺ¨λ‘Β λ°°μ—΄μ˜ μš”μ†Œλ₯Ό 콀마(,)둜 κ΅¬λΆ„ν•˜λŠ” λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•œλ‹€.
  • print()λ‚˜ console.log()의 인자둜 λ°°μ—΄μ˜ 이름을 μ œκ³΅ν•˜λ©΄ μžλ™μœΌλ‘œ λ°°μ—΄μ˜ toString()이 ν˜ΈμΆœλœλ‹€.
  • concat(), splice()λŠ” κΈ°μ‘΄ 배열을 μ΄μš©ν•΄ μƒˆ 배열을 λ§Œλ“ λ‹€. concat()은 두 개 μ΄μƒμ˜ 배열을 ν•©μ³μ„œ μƒˆ 배열을 λ§Œλ“€κ³ , splice()λŠ” κΈ°μ‘΄ λ°°μ—΄μ˜ μ„œλΈŒμ…‹μœΌλ‘œ μƒˆ 배열을 λ§Œλ“ λ‹€.
// concat()let itDiv = cisDept.concat(dmpDept);
console.log(itDiv);
인자둜 제곡된 배열이 μ›λž˜ λ°°μ—΄μ˜ λ’€λ‘œ μΆ”κ°€λœλ‹€.
splice()λŠ” μ‚¬μš©ν•  첫 μš”μ†Œμ˜ μœ„μΉ˜, κΈ°μ‘΄ λ°°μ—΄μ—μ„œ μ‚¬μš©ν•  μš”μ†Œμ˜ 수λ₯Ό 인자둜 λ°›λŠ”λ‹€.
// splice()let itDiv = ["D", "C", "R", "L", "J", "R", "C", "B"];
let dmpDept = itDiv.splice(3,3);
let cisDept = itDiv;

console.log(dmpDept);// ["L", "J", "R"]console.log(cisDept);// ["D", "C", "R", "C", "B"]
μ‚¬μš©ν• Β μ²« μš”μ†Œμ˜ μœ„μΉ˜λŠ” 3μ΄λ―€λ‘œ itDiv[3] = L λΆ€ν„° μ‚¬μš©ν•  μš”μ†Œμ˜ 수 3만큼 μž˜λΌμ„œ 3개의 μš”μ†Œλ₯Ό 가진 배열이 λ§Œλ“€μ–΄μ‘Œλ‹€. ν•΄λ‹Ή μš”μ†Œλ“€μ„ μ œμ™Έν•œ 배열은 itDiv에 λ‚¨μ•„μžˆμŒμ„ λ³Ό 수 μžˆλ‹€.
λ”°λΌμ„œ spliceλŠ”Β μ›ν•˜λŠ” μš”μ†Œλ₯Ό μ œκ±°ν•˜λŠ” μš©λ„λ‘œ μ‚¬μš©ν•  수 μžˆλ‹€.

CH2 λ°°μ—΄

2.4 λ³€ν˜•μž ν•¨μˆ˜

κ°œλ³„μ μœΌλ‘œ μš”μ†Œλ₯Ό κ±΄λ“œλ¦¬μ§€ μ•Šκ³  λ°°μ—΄ 전체 λ‚΄μš©μ„ κ³ μΉ˜λŠ” μ—¬λŸ¬ λ³€ν˜•μž ν•¨μˆ˜(mutator function)

2.4.1 배열에 μš”μ†Œ μΆ”κ°€ν•˜κΈ°

push(), unshift() ν•¨μˆ˜λŠ” 각각 배열에 μš”μ†Œλ₯Ό μΆ”κ°€ν•˜κ³ , λ°°μ—΄μ˜ μš”μ†Œλ₯Ό μ œκ±°ν•˜λŠ” ν•¨μˆ˜λ‹€. push()λŠ” λ°°μ—΄μ˜ 끝에 μš”μ†Œλ₯Ό μΆ”κ°€ν•œλ‹€. lengthλ₯Ό μ΄μš©ν•΄ 배열을 ν™•μž₯ν•˜λŠ” 것보닀 직관적이닀.
λ°°μ—΄μ˜ μ²˜μŒμ— μš”μ†Œλ₯Ό μΆ”κ°€ν•  λ•Œ λ³€ν˜•μž ν•¨μˆ˜κ°€ μ—†λ‹€λ©΄ 배열에 있던 κΈ°μ‘΄ λͺ¨λ“  μš”μ†Œλ₯Ό ν•œ μΉΈμ”© λ’€λ‘œ μ΄λ™μ‹œν‚¨ λ‹€μŒ μƒˆ 데이터λ₯Ό μΆ”κ°€ν•΄μ•Ό ν•œλ‹€.
// λ°°μ—΄μ˜ μ²˜μŒμ— μš”μ†Œλ₯Ό μΆ”κ°€ν•˜κΈ°let nums = [2, 3, 4, 5];
let newnum = 1;
let N = nums.length;
for (let i = N; i >= 0; --i) {
    nums[i] = nums[i - 1];// length둜 인덱슀λ₯Ό μ§€μ •ν•˜λ©΄ ν•œ μΉΈμ”© λ’€λ‘œ
}
nums[0] = newnum;
console.log(nums);// 1,2,3,4,5
λ°°μ—΄μ˜ μš”μ†Œκ°€ λ§Žμ„μˆ˜λ‘ μ½”λ“œμ˜ νš¨μœ¨μ„±μ΄ 떨어진닀.
unshift()λŠ” 이 고민을 ν•΄κ²°ν•΄μ€€λ‹€.
// unshift()let nums = [2, 3, 4, 5];
console.log(nums);// 2,3,4,5let newnum = 1;
nums.unshift(newnum);
console.log(nums);// 1,2,3,4,5

nums = [3, 4, 5];
nums.unshift(newnum, 2);
console.log(nums);// 1,2,3,4,5
ν•œ λ²ˆμ— μ—¬λŸ¬ μš”μ†Œλ₯Ό λ°°μ—΄ μ•žμœΌλ‘œ μΆ”κ°€ν•  μˆ˜λ„ μžˆλ‹€.

210501 ν† μš”μΌ 4일차

CH2 λ°°μ—΄

2.4 λ³€ν˜•μž ν•¨μˆ˜

2.4.2 λ°°μ—΄μ˜ μš”μ†Œ μ‚­μ œν•˜κΈ°

pop()Β  λ³€ν˜•μž ν•¨μˆ˜λ₯Ό μ΄μš©ν•˜λ©΄ κ°„λ‹¨ν•˜κ²Œ λ°°μ—΄μ˜ λ§ˆμ§€λ§‰ μš”μ†Œλ₯Ό μ œκ±°ν•  수 μžˆλ‹€.
let nums = [1,2,3,4,5,9];
nums.pop();
console.log(nums);// 1,2,3,4,5
λ°°μ—΄μ˜ μ•ž μš”μ†Œλ₯Ό μ œκ±°ν•  λ•Œ λ³€ν˜•μž ν•¨μˆ˜κ°€ μ—†λ‹€λ©΄ μš”μ†Œλ₯Ό μΆ”κ°€ν•  λ•Œμ™€ λ§ˆμ°¬κ°€μ§€λ‘œ λΉ„νš¨μœ¨μ μ΄λ‹€.
let nums = [9,1,2,3,4,5];
console.log(nums);
for ( let i = 0; i < nums.length; ++i){
	nums[i] = nums[i+1];
}
console.log(nums);// 1,2,3,4,5,
λΉ„νš¨μœ¨μ μΈ λ™μž‘ 후에 맨 끝에 λΆˆν•„μš”ν•œ 값이 μ €μž₯λœλ‹€. λ§ˆμ§€λ§‰ μ½€λ§ˆκ°€ 좜λ ₯된 κ²ƒμœΌλ‘œ μ•Œ 수 μžˆλ‹€.
shift() ν•¨μˆ˜λ₯Ό μ΄μš©ν•˜λ©΄ κ°„λ‹¨νžˆ λ°°μ—΄μ˜ 맨 처음 μš”μ†Œλ₯Ό μ œκ±°ν•  수 μžˆλ‹€.
let nums = [9,1,2,3,4,5];
nums.shift();
console.log(nums);// 1,2,3,4,5
μ΄λ²ˆμ—λŠ” λ°°μ—΄ 끝에 λΆˆν•„μš”ν•œ μš”μ†Œκ°€ μ—†μ–΄μ‘Œλ‹€.
pop()κ³Ό shift()λŠ” 제거된 μš”μ†Œλ₯Ό λ°˜ν™˜ν•˜λ―€λ‘œ ν•„μš”ν•˜λ©΄ 이 μš”μ†Œλ₯Ό λ³€μˆ˜μ— μ €μž₯ν•  수 μžˆλ‹€.
// pop,shiftλŠ” 제거된 μš”μ†Œλ₯Ό λ°˜ν™˜ν•˜μ—¬ μš”μ†Œλ₯Ό λ³€μˆ˜μ— μ €μž₯ν•  수 μžˆλ‹€.let nums = [6, 1, 2, 3, 4, 5];
let first = nums.shift();// 6 μ €μž₯
nums.push(first);
console.log(nums);// 1,2,3,4,5,6

2.4.3 λ°°μ—΄ 쀑간에 μš”μ†Œλ₯Ό μΆ”κ°€ν•˜κ±°λ‚˜ λ°°μ—΄μ˜ 쀑간에 μžˆλŠ” μš”μ†Œ μ‚­μ œν•˜κΈ°

쀑간에 μΆ”κ°€ν•˜κ±°λ‚˜ μ‚­μ œν•  λ•Œλ„ λ‹€λ₯Έ μš”μ†Œλ₯Ό μ΄λ™μ‹œμΌœμ•Ό ν•˜λŠ” λ¬Έμ œκ°€ 생긴닀. splice()λ₯Ό μ΄μš©ν•˜λ©΄ ν•œλ²ˆμ— 두 가지 λ™μž‘μ„ μˆ˜ν–‰ν•  수 μžˆλ‹€.
배열에 μš”μ†Œλ₯Ό μΆ”κ°€ν•˜λ €λ©΄ μ„Έ 가지 μΈμžκ°€ ν•„μš”ν•˜λ‹€.
  • μ‹œμž‘ 인덱슀(μ–΄λŠ 지점뢀터 μš”μ†Œλ₯Ό μΆ”κ°€ν•  것인지)
  • μ‚­μ œν•  μš”μ†Œμ˜ 개수(μš”μ†Œλ₯Ό μΆ”κ°€ν•  λ•ŒλŠ” O)
  • 배열에 μΆ”κ°€ν•  μš”μ†Œλ“€
let nums = [1, 2, 3, 7, 8, 9];
let newElements = [4, 5, 6];
nums.splice(3, 0, ...newElements);
console.log(nums);// 1,2,3,4,5,6,7,8,9
μ‹œμž‘Β μΈλ±μŠ€Β 3(nums[3]),Β 0μ΄λ―€λ‘œΒ μš”μ†ŒΒ μΆ”κ°€,Β κ·ΈΒ λ‹€μŒλΆ€ν„°λŠ”Β μΆ”κ°€ν•˜λ €λŠ”Β μš”μ†ŒΒ λͺ©λ‘μ„Β μžμœ λ‘­κ²ŒΒ μ œκ³΅ν•˜λ©΄Β λœλ‹€.
// splice() : 쀑간에 μ‚­μ œlet nums = [1, 2, 3, 100, 200, 300, 400, 4, 5];
nums.splice(3, 4);
console.log(nums);// 1,2,3,4,5
μ‹œμž‘Β μΈλ±μŠ€Β 3(nums[3])λΆ€ν„°Β μš”μ†ŒΒ 4개λ₯ΌΒ μ‚­μ œν•œλ‹€.
2.4.4 λ°°μ—΄ μš”μ†Œ μ •λ ¬ν•˜κΈ°
reverse()λŠ” λ°°μ—΄μ˜ μš”μ†Œλ₯Ό μ—­μˆœμœΌλ‘œ λ°”κΎΌλ‹€.
let nums = [1, 2, 3, 4, 5];
nums.reverse();
console.log(nums);// 5,4,3,2,1
sort() ν•¨μˆ˜κ°€ λ°°μ—΄ μš”μ†Œλ₯Ό μˆœμ„œλŒ€λ‘œ μ •λ ¬ν•˜λ©° 특히 λ¬Έμžμ—΄μ„ μ •λ ¬ν•  λ•Œ μœ μš©ν•˜λ‹€.
// sort() : μˆœμ„œλŒ€λ‘œ μ •λ ¬let names = ["D", "M", "C", "Cl", "B", "R"];
nums.sort();
console.log(names);// B, Cl, C, D, M, R
μˆ«μžλŠ” μƒκ°λŒ€λ‘œ λ˜μ§€ μ•ŠλŠ”λ‹€.
sort()λŠ” λ°°μ—΄ μš”μ†Œλ₯Ό λ¬Έμžμ—΄λ‘œ κ°„μ£Όν•˜κ³  μ•ŒνŒŒλ²³ 순으둜 μš”μ†Œλ₯Ό μ •λ ¬ν•œλ‹€. sort()에 μˆœμ„œλ₯Ό κ²°μ •ν•΄μ£ΌλŠ” ν•¨μˆ˜λ₯Ό 인자둜 μ „λ‹¬ν•˜λ©΄ 이λ₯Ό 톡해 숫자λ₯Ό μ˜¬λ°”λ₯΄κ²Œ μ •λ ¬ν•  수 μžˆλ‹€.
λ‹¨μˆœν•˜κ²Œ ν•œ μˆ«μžμ—μ„œ λ‹€λ₯Έ 숫자λ₯Ό λΉΌλŠ” λ°©μ‹μœΌλ‘œ 숫자의 μˆœμ„œλ₯Ό κ²°μ •ν•˜λŠ” ν•¨μˆ˜λ₯Ό κ΅¬ν˜„ν•  수 μžˆλ‹€. λΊ„μ…ˆ κ²°κ³Όκ°€ 음수면 μ™Όμͺ½μ΄ μž‘λ‹€λŠ” 것이고 0이면 κ°™λ‹€λŠ” 것이며, κ²°κ³Όκ°€ μ–‘μˆ˜λ©΄ μ™Όμͺ½μ΄ 였λ₯Έμͺ½λ³΄λ‹€ ν¬λ‹€λŠ” 것이닀.
// sort() 숫자 μ •λ ¬ ν•¨μˆ˜function compare(num1, num2) {
    return num1 - num2;
}
let nums = [3, 1, 2, 100, 4, 200];
nums.sort(compare);
console.log(nums);// 1,2,3,4,100,200

2.5 반볡자 ν•¨μˆ˜

반볡자 ν•¨μˆ˜λŠ”Β λ°°μ—΄μ˜ 각 μš”μ†Œμ— ν•¨μˆ˜λ₯Ό μ μš©ν•œ λ‹€μŒ κ·Έ κ²°κ³ΌΒ κ°’ λ˜λŠ” κ°’μ˜ 집합 λ˜λŠ” μƒˆλ‘œμš΄ 배열을 λ°˜ν™˜ν•œλ‹€.

2.5.1 배열을 λ§Œλ“€μ§€ μ•ŠλŠ” 반볡자 ν•¨μˆ˜

배열을 λ§Œλ“€μ§€ μ•ŠλŠ”Β λ°˜λ³΅μž ν•¨μˆ˜λ‘œΒ forEach()Β ν•¨μˆ˜κ°€ μžˆλ‹€.Β λ°°μ—΄μ˜ λͺ¨λ“  μš”μ†Œμ— 인자둜 받은 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•œλ‹€.
function square(num) {
    console.log(num, num * num);
}

let nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
nums.forEach(square);
every()λŠ”Β λΆˆλ¦° ν•¨μˆ˜λ₯Ό 배열에 μ μš©ν•΄ λ°°μ—΄μ˜ λͺ¨λ“  μš”μ†Œκ°€ 참이면 trueλ₯Ό λ°˜ν™˜ν•œλ‹€.
// every() : 뢈린 ν•¨μˆ˜λ₯Ό 배열에 적용, λͺ¨λ“  μš”μ†Œκ°€ 참이면 true λ°˜ν™˜.function isEven(num) {
    return num % 2 == 0;
}

let nums = [2, 4, 6, 8, 10];
let even = nums.every(isEven);
if (even) {
    console.log("all numbers are even");
} else {
    console.log("not all numbers are even");
}
some()Β ν•¨μˆ˜λŠ” λ°°μ—΄ μš”μ†Œ μ€‘μ—Β ν•œ μš”μ†ŒλΌλ„ 인자둜 받은 뢈린 μš”μ†Œμ˜ 기쀀을 λ§Œμ‘±ν•˜λ©΄ trueλ₯Ό λ°˜ν™˜ν•œλ‹€.
// some() : 뢈린 ν•¨μˆ˜λ₯Ό 배열에 적용, ν•˜λ‚˜λΌλ„ μš”μ†Œκ°€ 참이면 true λ°˜ν™˜.function isEven(num) {
    return num % 2 == 0;
}

let nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let someEven = nums.some(isEven);
if (someEven) {
    console.log("some numbers are even");
} else {
    console.log("not all numbers are even");
}
nums = [1, 3, 5, 7, 9];
someEven = nums.some(isEven);
if (someEven) {
    console.log("some numbers are even");
} else {
    console.log("no numbers are even");
}
reduce()Β ν•¨μˆ˜λŠ” λˆ„μ μž ν•¨μˆ˜λ₯Ό 인자둜 받은 λ‹€μŒΒ λ°°μ—΄μ˜ λͺ¨λ“  μš”μ†Œλ₯Ό λˆ„μ μž ν•¨μˆ˜μ— μ μš©ν•œλ‹€. reduce()λŠ” add()λ₯Ό μ΄μš©ν•΄ μ™Όμͺ½μ—μ„œ 였λ₯Έμͺ½μœΌλ‘œ λ°°μ—΄μ˜ 합을 κ³„μ‚°ν•œλ‹€.
add(1,2) => 3
add(3,3) => 6
add(6,4) => 10
,,,
reduce() ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄ λ¬Έμžμ—΄μ„ μ—°κ²°ν•  μˆ˜λ„ μžˆλ‹€.
// reduce() : λ¬Έμžμ—΄λ„ μ—°κ²°ν•  수 μžˆλ‹€.function concat(accumulatedString, item) {
    return accumulatedString + item;
}

let words = ["the ", "quick ", "brown ", "fox "];
let sentence = words.reduce(concat);
console.log(sentence);// the quick brown fox
reduceRight()λŠ” λ°°μ—΄μ˜Β μ˜€λ₯Έμͺ½ μš”μ†Œμ—μ„œ μ™Όμͺ½ μš”μ†Œλ‘œ μ²˜λ¦¬ν•˜λŠ” λ°©ν–₯만 λ‹€λ₯΄λ‹€.
// reduceRight() : 였λ₯Έμͺ½μ—μ„œ μ™Όμͺ½μœΌλ‘œ 처리. μˆœμ„œ 뒀집기function concat(accumulatedString, item){
  return accumulatedString + item
}

let words = ["the ", "quick ", "brown ", "fox "]
let sentence = words.reduceRight(concat);
console.log(sentence);// "fox brown quick the"

2.5.2 μƒˆ 배열을 λ°˜ν™˜ν•˜λŠ” 반볡자 ν•¨μˆ˜

map(), filter()Β ν•¨μˆ˜λŠ”Β λͺ¨λ‘ μƒˆ 배열을 λ°˜ν™˜ν•˜λŠ” 반볡자 ν•¨μˆ˜λ‹€. map()은 forEach() 처럼 λ°°μ—΄μ˜ 각 μš”μ†Œμ— ν•¨μˆ˜λ₯Ό μ μš©ν•˜λŠ” ν•¨μˆ˜λ‹€. λ‹€λ§ŒΒ map()은 λ°°μ—΄ μš”μ†Œμ— ν•¨μˆ˜λ₯Ό μ μš©ν•œ κ²°κ³Όλ₯Ό ν¬ν•¨ν•˜λŠ” μƒˆ 배열을 λ°˜ν™˜ν•œλ‹€λŠ” 점이 λ‹€λ₯΄λ‹€.
// map() : λ°°μ—΄μ˜ 각 μš”μ†Œμ— ν•¨μˆ˜λ₯Ό μ μš©ν•˜κ³  κ·Έ κ²°κ³Όλ₯Ό ν¬ν•¨ν•˜λŠ” μƒˆ 배열을 λ°˜ν™˜ν•œλ‹€.function curve(grade) {
    return (grade += 5);
}

let grades = [77, 65, 81, 92, 83];
let newgrades = grades.map(curve);
console.log(newgrades);// 82, 70, 86, 97, 88
λ¬Έμžμ—΄μ— map() μ‚¬μš©
function first(word){
	return word[0];
}

let words = ["for", "your", "information"]
let acronym = words.map(first)
console.log(acronym.join(""));// "fyi"
toString() 을 μ΄μš©ν•΄ μš”μ†Œλ₯Ό 좜λ ₯ν•˜λ©΄Β μ½€λ§ˆκ°€ ν‘œμ‹œλ˜λ―€λ‘œ κ³΅λ°±λ¬Έμžμ—΄μ„ λΆ„λ¦¬μžλ‘œ μ‚¬μš©ν•˜λ„λ‘ join()을 ν˜ΈμΆœν•œλ‹€.
filter()λŠ” every()와 λΉ„μŠ·ν•˜λ‹€.Β filter()λŠ” 뢈린 ν•¨μˆ˜λ₯Ό λ§Œμ‘±ν•˜λŠ” μš”μ†Œλ₯Ό ν¬ν•¨ν•˜λŠ” μƒˆλ‘œμš΄ 배열을 λ°˜ν™˜ν•œλ‹€.
// filter() : 뢈린 ν•¨μˆ˜λ₯Ό λ§Œμ‘±ν•˜λŠ” μš”μ†Œλ₯Ό ν¬ν•¨ν•˜λŠ” μƒˆλ‘œμš΄ 배열을 λ°˜ν™˜function isEven(num) {
    return num % 2 == 0;
}

function isOdd(num) {
    return num % 2 != 0;
}

let nums = [];
for (let i = 0; i < 20; ++i) {
    nums[i] = i + 1;
}
let evens = nums.filter(isEven);
console.log("Even numbers: ");
console.log(evens);
let odds = nums.filter(isOdd);
console.log("Odd numbers: ");
console.log(odds);
// filter() : 성적 μ²˜λ¦¬μ— 이용function passing(num) {
    return num >= 60;
}
let grades = [];
for (let i = 0; i < 20; ++i) {
    grades[i] = Math.floor(Math.random() * 101);
}
let passGrades = grades.filter(passing);
console.log("All grades: ");
console.log(grades);
console.log("Passing grades: ");
console.log(passGrades);
λ¬Έμžμ—΄μ— filter() 적용.Β eμ•žμ— i, c λ‹€μŒμ— λ‚˜μ˜¨ e μ•žμ—λŠ” iκ°€ λ‚˜μ˜€μ§€ μ•Šμ•„λ„ λœλ‹€λ₯Ό κ΅¬ν˜„ν•œ 예제
// fliter() : λ¬Έμžμ—΄μ— 적용function afterc(str) {
    if (str.indexOf("cie") > -1) {
        return true;
    }
    return false;
}

let words = ["recie", "dec", "percie", "dec", "concie"];
let misspelled = words.filter(afterc);
console.log(misspelled);// rec, per, con

2.6 이차원 λ°°μ—΄κ³Ό 닀차원 λ°°μ—΄

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 기본적으둜 μΌμ°¨μ›λ§Œ μ§€μ›ν•˜μ§€λ§Œ 닀차원 배열을 λ§Œλ“€ 수 μžˆλ‹€.

2.6.1 이차원 λ°°μ—΄ λ§Œλ“€κΈ°

배열을 λ§Œλ“  λ‹€μŒ 각 μš”μ†Œλ₯Ό λ°°μ—΄λ‘œ λ§Œλ“€μ–΄μ•Ό ν•œλ‹€. μ΅œμ†Œν•œ λ°°μ—΄μ˜ ν–‰ 개수λ₯Ό μ•Œμ•„μ•Ό 이차원 배열을 λ§Œλ“€ 수 μžˆλ‹€.
let twod = [];
let rows = 5;
for ( let i = 0; i < rows; ++i ) {
	twod[i] = [];
}
λ°°μ—΄μ˜ λͺ¨λ“  μš”μ†Œκ°€ undefinedκ°€ λœλ‹€λŠ” 단점이 μžˆλ‹€.
이 ν•¨μˆ˜λŠ” λ°°μ—΄μ˜Β ν–‰κ³Ό μ—΄μ˜ 개수λ₯Ό μ„€μ •ν•˜λ©° ν•¨μˆ˜μ— 제곡된 κ°’μœΌλ‘œ λͺ¨λ“  μš”μ†Œλ₯Ό μ΄ˆκΈ°ν™”ν•œλ‹€.
Array.matrix = function (numrows, numcols, initial) {
    let arr = [];
    for (let i = 0; i < numrows; ++i) {
        let columns = [];
        for (let j = 0; j < numcols; ++j) {
            columns[j] = initial;
        }
        arr[i] = columns;
    }

    return arr;
};

let arr = Array.matrix(3, 2, 3);
console.log(arr);
κ°„λ‹¨ν•œ 데이터 집합은 μ•„λž˜ μ½”λ“œλ‘œ κ°€μž₯ μ‰½κ²Œ λ§Œλ“€ 수 μžˆλ‹€.
let grade = [[89,77], [75,82]];

2.6.2 이차원 λ°°μ—΄ μš”μ†Œ μ²˜λ¦¬ν•˜κΈ°

두 가지 μ£Όμš” νŒ¨ν„΄μ΄ μžˆλ‹€. ν•œ κ°€μ§€λŠ” λ°°μ—΄μ˜ 열을 κΈ°μ€€μœΌλ‘œ ν•˜λŠ” 것이고, λ‹€λ₯Έ 것은 행을 κΈ°μ€€μœΌλ‘œ μš”μ†Œλ₯Ό μ²˜λ¦¬ν•˜λŠ” 것이닀.
두 νŒ¨ν„΄ λͺ¨λ‘ 쀑첩 for문을 μ‚¬μš©ν•œλ‹€.Β μ—΄ κΈ°μ€€ μ²˜λ¦¬μ—μ„œλŠ” μ™ΈλΆ€ 루프가 ν–‰μ²˜λ¦¬, μ•ˆμͺ½ 루프가 μ—΄ 처리. grades μ—μ„œ 각 행이 ν•œ ν•™μƒμ˜ 점수 집합을 ν¬ν•¨ν•œλ‹€κ³  κ°„μ£Όν•œλ‹€. λ”°λΌμ„œ ν–‰μ˜ λͺ¨λ“  점수λ₯Ό 더해 total λ³€μˆ˜μ— μ €μž₯ν•œ λ‹€μŒ total λ³€μˆ˜λ₯Ό 행에 μžˆλŠ” 점수의 개수둜 λ‚˜λˆ„λ©΄ 평균을 ꡬ할 수 μžˆλ‹€.
let grades = [
    [89, 77, 78],
    [76, 82, 81],
    [91, 94, 89],
];
let total = 0;
let average = 0.0;
for (let row = 0; row < grades.length; ++row) {
    for (let col = 0; col < grades[row].length; ++col) {
        total += grades[row][col];
    }
    average = total / grades[row].length;
    console.log(
        "Student " + parseInt(row + 1) + " average: " + average.toFixed(2)
    );
    total = 0;
    average = 0.0;
}
각 행은 배열을 ν¬ν•¨ν•˜λ―€λ‘œ 각 ν–‰μ—λŠ” length ν”„λ‘œνΌν‹°κ°€ μžˆλ‹€.
각 ν•™μƒμ˜ 점수 평균은 toFixed(n) 에 μ˜ν•΄ μ†Œμˆ˜μ  두 자릿수둜 λ°˜μ˜¬λ¦Όλœλ‹€.
ν–‰ μ€‘μ‹¬μœΌλ‘œ μ²˜λ¦¬ν•˜λ €λ©΄ μ™ΈλΆ€ 루프가 열을 μ²˜λ¦¬ν•˜κ³  λ‚΄λΆ€ 루프가 행을 μ²˜λ¦¬ν•˜λ„λ‘ λ°”κΎΈλ©΄ λœλ‹€.

2.6.3 λ“€μ­‰λ‚ μ­‰ν•œ λ°°μ—΄

λ°°μ—΄μ˜ 행이 ν¬ν•¨ν•˜λŠ” μš”μ†Œμ˜ κ°œμˆ˜κ°€ μ„œλ‘œ λ‹€λ₯Έ 배열이닀. λ‹€λ₯Έ 언어에 λΉ„ν•΄Β JSλŠ” 각 ν–‰μ˜ 길이λ₯Ό μ •ν™•νžˆ μ•Œ 수 μžˆμœΌλ―€λ‘œ λ“€μ­‰λ‚ μ­‰ν•œ 배열도 잘 μ²˜λ¦¬ν•  수 μžˆλ‹€.

2.7 객체λ₯Ό μš”μ†Œλ‘œ ν¬ν•¨ν•˜λŠ” λ°°μ—΄

배열은 객체도 μš”μ†Œλ‘œ 포함할 수 있으며 μ§€κΈˆκΉŒμ§€ μ‚΄νŽ΄λ³Έ ν•¨μˆ˜μ™€ ν”„λ‘œνΌν‹°λ„ 잘 λ™μž‘ν•œλ‹€.
function Point(x, y) {
    this.x = x;
    this.y = y;
}

function displayPts(arr) {
    for (let i = 0; i < arr.length; ++i) {
        console.log(arr[i].x + ", " + arr[i].y);
    }
}

let p1 = new Point(1, 2);
let p2 = new Point(3, 5);
let p3 = new Point(2, 8);
let p4 = new Point(4, 4);
let points = [p1, p2, p3, p4];
for (let i = 0; i < points.length; ++i) {
    console.log(
        "Point " + parseInt(i + 1) + ": " + points[i].x + ", " + points[i].y
    );
}
let p5 = new Point(12, -3);
points.push(p5);
console.log("After push : ");
displayPts(points);
points.shift();
console.log("After shift : ");
displayPts(points);
push()λ₯Ό μ΄μš©ν•΄ 12, -3을 μΆ”κ°€ν–ˆμœΌλ©° shift()λ₯Ό μ΄μš©ν•΄ 1,2 λ₯Ό μ œκ±°ν–ˆλ‹€.