Codeκ°œλ°œμΌμ§€

[JS] koans 볡슡[(암묡,λͺ…μ‹œ)νƒ€μž…λ³€ν™˜, ν˜Έμ΄μŠ€νŒ…, ν™”μ‚΄ν‘œν•¨μˆ˜, …etc]

Minhhk 2022. 11. 9. 15:30
😁 λ­”κ°€ μž₯ν™©ν•˜κ²Œ λ‚˜μ—΄ν•œκ±° 같은데,, λ‚˜λ¦„ ν—·κ°ˆλ Έλ˜ 것 μœ„μ£Όλ‘œ 정리λ₯Ό ν•΄λ³΄μ•˜λ‹€!

생각보닀 μ•Œκ³  μžˆλŠ” 것이라고 μƒκ°ν•œ 것듀이 였히렀 λ“€μ–΄κ°€μ„œ 문제λ₯Ό ν’€μ–΄λ³΄λ‹ˆ
λ‚˜λŠ” μ œλŒ€λ‘œ μ•Œκ³  있던 것이 μ•„λ‹ˆμ—ˆκ³ , μ•ˆλ‹€κ³  μ°©κ°ν•˜κ³  λŒ€μΆ© μ“°κ³  μžˆμ—ˆλ‹€γ…‹γ…‹γ…‹
μ •μ‹  차리고~~ 차근히 λ‹€μ‹œ ν•˜λ©΄ λ˜λ‹ˆκΉŒ λ“œγ…‘γ…‘κ°€μž!!

 

암묡적 νƒ€μž… λ³€ν™˜(Implicit coercion) || νƒ€μž… κ°•μ œ λ³€ν™˜(Type coercion)

let a = 1
let b = true

console.log(a+b) // 2

typeof(a+b) // 'number'

let a = 1
let b = '1'

console.log(a+b) // 11

typeof(a+b) // 'string'

let a = 12
let b = '1'

// + μ œμ™Έν•œ -, *, / λŠ” λ„˜λ²„λ‘œ μΈμ‹ν•˜μ—¬ 계산 -> λ„μΆœ
console.log(a-b) // 11

typeof(a-b) // 'number'

// 슀트링이면 슀트링 λ°˜ν™˜
let a = '12'
let b = true

console.log(a+b) // 12true

typeof(a+b) // 'string'

---

let a = true
let b = '12'

console.log(a+b) // true12

typeof(a+b) // 'string'

---
// 숫자면 숫자 λ°˜ν™˜
let a = 12
let b = true

console.log(a+b) // 13

typeof(a+b) // 'number'

μ΅œλŒ€ν•œ 같은 νƒ€μž…λΌλ¦¬ 연산을 ν•˜κ³ , 즉 μ—„κ²©ν•œ λ™μΉ˜ μ—°μ‚°('===')을 μ‚¬μš©ν•˜κ³ , 쑰건문에 비ꡐ 연산을 λͺ…μ‹œν•˜λŠ” 것이 훨씬 μ’‹λ‹€.

// 논리합(||) μ—°μ‚°μž
// 논리 μ—°μ‚°μ˜ κ²°κ³Όλ₯Ό κ²°μ •ν•œ 첫번째 ν”Όμ—°μ‚°μžμ˜ 평가 κ²°κ³Ό 즉, λ¬Έμžμ—΄ ‘Cat’λ₯Ό κ·ΈλŒ€λ‘œ λ°˜ν™˜ν•œλ‹€.
'Cat' || 'Dog'  // 'Cat'

false || 'Dog'  // 'Dog'
'Cat' || false  // 'Cat'

// 논리곱(&&) μ—°μ‚°μž
// 논리곱 μ—°μ‚°μž &&λŠ” 논리 μ—°μ‚°μ˜ κ²°κ³Όλ₯Ό κ²°μ •ν•œ λ‘λ²ˆμ§Έ ν”Όμ—°μ‚°μžμ˜ 평가 κ²°κ³Ό 즉, λ¬Έμžμ—΄ ‘Dog’λ₯Ό κ·ΈλŒ€λ‘œ λ°˜ν™˜ν•œλ‹€.
'Cat' && 'Dog'  // Dog

false && 'Dog'  // false
'Cat' && false  // false

λͺ…μ‹œμ  νƒ€μž… λ³€ν™˜

  • 슀트링 λ³€ν™˜
// 1. String μƒμ„±μž ν•¨μˆ˜λ₯Ό new μ—°μ‚°μž 없이 ν˜ΈμΆœν•˜λŠ” 방법
// 숫자 νƒ€μž… => λ¬Έμžμ—΄ νƒ€μž…
console.log(String(1));        // "1"
console.log(String(NaN));      // "NaN"
console.log(String(Infinity)); // "Infinity"
// λΆˆλ¦¬μ–Έ νƒ€μž… => λ¬Έμžμ—΄ νƒ€μž…
console.log(String(true));     // "true"
console.log(String(false));    // "false"

// 2. Object.prototype.toString λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 방법
// 숫자 νƒ€μž… => λ¬Έμžμ—΄ νƒ€μž…
console.log((1).toString());        // "1"
console.log((NaN).toString());      // "NaN"
console.log((Infinity).toString()); // "Infinity"
// λΆˆλ¦¬μ–Έ νƒ€μž… => λ¬Έμžμ—΄ νƒ€μž…
console.log((true).toString());     // "true"
console.log((false).toString());    // "false"
  • μˆ«μžν˜• λ³€ν™˜
// 1. Number μƒμ„±μž ν•¨μˆ˜λ₯Ό new μ—°μ‚°μž 없이 ν˜ΈμΆœν•˜λŠ” 방법
// λ¬Έμžμ—΄ νƒ€μž… => 숫자 νƒ€μž…
console.log(Number('0'));     // 0
console.log(Number('-1'));    // -1
console.log(Number('10.53')); // 10.53
// λΆˆλ¦¬μ–Έ νƒ€μž… => 숫자 νƒ€μž…
console.log(Number(true));    // 1
console.log(Number(false));   // 0

// 2. parseInt, parseFloat ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 방법(λ¬Έμžμ—΄λ§Œ λ³€ν™˜ κ°€λŠ₯)
// λ¬Έμžμ—΄ νƒ€μž… => 숫자 νƒ€μž…
console.log(parseInt('0'));       // 0
console.log(parseInt('-1'));      // -1
console.log(parseFloat('10.53')); // 10.53
  • λΆˆλ¦¬μ–Ένƒ€μž… λ³€ν™˜
// 1. Boolean μƒμ„±μž ν•¨μˆ˜λ₯Ό new μ—°μ‚°μž 없이 ν˜ΈμΆœν•˜λŠ” 방법
// λ¬Έμžμ—΄ νƒ€μž… => λΆˆλ¦¬μ–Έ νƒ€μž…
console.log(Boolean('x'));       // true
console.log(Boolean(''));        // false
console.log(Boolean('false'));   // true
// 숫자 νƒ€μž… => λΆˆλ¦¬μ–Έ νƒ€μž…
console.log(Boolean(0));         // false
console.log(Boolean(1));         // true
console.log(Boolean(NaN));       // false
console.log(Boolean(Infinity));  // true
// null νƒ€μž… => λΆˆλ¦¬μ–Έ νƒ€μž…
console.log(Boolean(null));      // false
// undefined νƒ€μž… => λΆˆλ¦¬μ–Έ 타 μž…
console.log(Boolean(undefined)); // false
// 객체 νƒ€μž… => λΆˆλ¦¬μ–Έ νƒ€μž…
console.log(Boolean({}));        // true
console.log(Boolean([]));        // true

ν˜Έμ΄μŠ€νŒ…μ΄λž€

ν˜Έμ΄μŠ€νŒ…(Hoisting)의 κ°œλ… ν•¨μˆ˜ μ•ˆμ— μžˆλŠ” 선언듀을 λͺ¨λ‘ λŒμ–΄μ˜¬λ €μ„œ ν•΄λ‹Ή ν•¨μˆ˜ 유효 λ²”μœ„μ˜ μ΅œμƒλ‹¨μ— μ„ μ–Έν•˜λŠ” 것을 λ§ν•œλ‹€.

  • μžλ°”μŠ€ν¬λ¦½νŠΈ ν•¨μˆ˜λŠ” μ‹€ν–‰λ˜κΈ° 전에 ν•¨μˆ˜ μ•ˆμ— ν•„μš”ν•œ λ³€μˆ˜κ°’λ“€μ„ λͺ¨λ‘ λͺ¨μ•„μ„œ 유효 λ²”μœ„μ˜ μ΅œμƒλ‹¨μ— μ„ μ–Έν•œλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈ Parserκ°€ ν•¨μˆ˜ μ‹€ν–‰ μ „ ν•΄λ‹Ή ν•¨μˆ˜λ₯Ό ν•œ 번 ν›‘λŠ”λ‹€. ν•¨μˆ˜ μ•ˆμ— μ‘΄μž¬ν•˜λŠ” λ³€μˆ˜/ν•¨μˆ˜μ„ μ–Έμ— λŒ€ν•œ 정보λ₯Ό κΈ°μ–΅ν•˜κ³  μžˆλ‹€κ°€ μ‹€ν–‰μ‹œν‚¨λ‹€. 유효 λ²”μœ„: ν•¨μˆ˜ 블둝 {} μ•ˆμ—μ„œ 유효
  • 즉, ν•¨μˆ˜ λ‚΄μ—μ„œ μ•„λž˜μͺ½μ— μ‘΄μž¬ν•˜λŠ” λ‚΄μš© 쀑 ν•„μš”ν•œ 값듀을 λŒμ–΄μ˜¬λ¦¬λŠ” 것이닀. μ‹€μ œλ‘œ μ½”λ“œκ°€ λŒμ–΄μ˜¬λ €μ§€λŠ” 건 μ•„λ‹ˆλ©°, μžλ°”μŠ€ν¬λ¦½νŠΈ Parser λ‚΄λΆ€μ μœΌλ‘œ λŒμ–΄μ˜¬λ €μ„œ μ²˜λ¦¬ν•˜λŠ” 것이닀. μ‹€μ œ λ©”λͺ¨λ¦¬μ—μ„œλŠ” λ³€ν™”κ°€ μ—†λ‹€.

ν•¨μˆ˜ 선언식은 ν˜Έμ΄μŠ€νŒ…μ— 영ν–₯을 λ°›μ§€λ§Œ, ν•¨μˆ˜ ν‘œν˜„μ‹μ€ ν˜Έμ΄μŠ€νŒ…μ— 영ν–₯을 받지 μ•ŠλŠ”λ‹€.

// μ‹€ν–‰ μ „
logMessage();
sumNumbers();

function logMessage() {
  return 'worked';
}

var sumNumbers = function () {
  return 10 + 20;
};
// μ‹€ν–‰ μ‹œ
function logMessage() {
  return 'worked';
}

var sumNumbers;

logMessage(); // 'worked'
sumNumbers(); // Uncaught TypeError: sumNumbers is not a function

sumNumbers = function () {
  return 10 + 20;
};

TIP ν˜Έμ΄μŠ€νŒ… μ‚¬μš© μ‹œ 주의

  • μ½”λ“œμ˜ 가독성과 μœ μ§€λ³΄μˆ˜λ₯Ό μœ„ν•΄ ν˜Έμ΄μŠ€νŒ…μ΄ μΌμ–΄λ‚˜μ§€ μ•Šλ„λ‘ ν•œλ‹€. ν˜Έμ΄μŠ€νŒ…μ„ μ œλŒ€λ‘œ λͺ¨λ₯΄λ”라도 ν•¨μˆ˜μ™€ λ³€μˆ˜λ₯Ό 가급적 μ½”λ“œ μƒλ‹¨λΆ€μ—μ„œ μ„ μ–Έν•˜λ©΄, ν˜Έμ΄μŠ€νŒ…μœΌλ‘œ μΈν•œ μŠ€μ½”ν”„ κΌ¬μž„ ν˜„μƒμ€ 방지할 수 μžˆλ‹€. let/constλ₯Ό μ‚¬μš©ν•œλ‹€.
  • varλ₯Ό μ“°λ©΄ ν˜Όλž€μŠ€λŸ½κ³  μ“Έλͺ¨μ—†λŠ” μ½”λ“œκ°€ 생길 수 μžˆλ‹€. 그럼 μ™œ var와 ν˜Έμ΄μŠ€νŒ…μ„ 이해해야 ν• κΉŒ? ES6λ₯Ό μ–΄λ””μ—μ„œλ“  μ“Έ 수 있으렀면 아직 μ‹œκ°„μ΄ 더 ν•„μš”ν•˜λ―€λ‘œ ES5둜 νŠΈλžœμŠ€μ»΄νŒŒμΌμ„ ν•΄μ•Όν•œλ‹€. λ”°λΌμ„œ 아직은 varκ°€ μ–΄λ–»κ²Œ λ™μž‘ν•˜λŠ”μ§€ μ΄ν•΄ν•˜κ³  μžˆμ–΄μ•Ό ν•œλ‹€.

 βœ… (ν˜Έμ΄μŠ€νŒ… 포슀트 μ°Έκ³ !) https://gmlwjd9405.github.io/2019/04/22/javascript-hoisting.html

 


πŸ“Œ κΉŠμ€λ³΅μ‚¬λΌλŠ”κ±΄ μ£Όμ†Œκ°’μ„ κ°€μ Έμ˜€λŠ”κ²Œ μ•„λ‹ˆλΌ κ·Έ κ°’ 자체만 κ°€μ Έμ˜€λŠ”κ²ƒμ΄λ‹€.

arr1 = [1,2,3,4]; let arr3 = [...arr1]; 으둜 λ³΅μ‚¬ν•˜λ©΄?

arr3을 κ±΄λ“œλ €λ„ arr1에 영ν–₯을 받지 μ•ŠλŠ”λ‹€ → μ™œλƒν•˜λ©΄ arr1κ³Ό arr3의 μ£Όμ†Œκ°€ λ‹€λ₯΄κΈ° λ•Œλ¬Έμ΄λ‹€.

 

μ£Όμ†Œκ°’μ„ λŠμ–΄μ„œ μš”μ†Œλ§Œ λ³΅μ‚¬ν•˜λŠ”κ±Έ κΉŠμ€λ³΅μ‚¬

μ£Όμ†Œκ°’μ„ κ°€μ Έμ˜€λŠ”κ²ƒμ„ 얕은볡사

Object.assign()
μ „κ°œμ—°μ‚°μž ...???

객체의 ν•œλ‹¨κ³„κΉŒμ§€μ˜ κΉŠμ€λ³΅μ‚¬λ§Œ κ°€λŠ₯ν•˜κ³ ,

κ·Έ μ΄μƒμ˜ depthλΆ€ν„°λŠ” μ—¬μ „νžˆ 얕은볡사가 μΌμ–΄λ‚œλ‹€,,


ν™”μ‚΄ν‘œ ν•¨μˆ˜ , let func = ( ) ⇒ { }

// ν•¨μˆ˜ ν‘œν˜„μ‹
function () {
    const add = function (x, y) {
        return x + y
}

// ν™”μ‚΄ν‘œ ν•¨μˆ˜
const add = (x, y) => {
    return x + y
}

console.log(add(1,2)) // 3

// 리턴을 μƒλž΅ κ°€λŠ₯
const subtract = (x, y) => x - y

// ν•„μš”μ— 따라 μ†Œκ΄„ν˜Έλ₯Ό 뢙일 μˆ˜λ„ μžˆλ‹€.
const multiply = (x, y) => (x * y)

// νŒŒλΌλ―Έν„°κ°€ ν•˜λ‚˜μΌ 경우 μ†Œκ΄„ν˜Έ μƒλž΅μ΄ κ°€λŠ₯!
const divideBy10 = x => x / 10

// 'ν™”μ‚΄ν‘œ ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄ ν΄λ‘œμ €λ₯Ό ν‘œν˜„
// 1
const adder = x => {
  return y => {
    return x + y
  }
}

// 2
const subtractor = x => y => {
  return x - y
}

μ›μ‹œμžλ£Œν˜•, μ°Έμ‘°μžλ£Œν˜•

let num = 123;
    const msg = "hello";
    let arr = [1, 2, 3];
    const isOdd = true;

  μ›μ‹œ μžλ£Œν˜•μ˜ 데이터가 μ €μž₯λ˜λŠ” 곡간 (stack)
     1 | num |   123
     2 | msg | "hello"
     3 | arr | heap의 12λ²ˆλΆ€ν„° 3개  // (μ‹€μ œ 데이터가 μ €μž₯λ˜μ–΄ μžˆλŠ” μ£Όμ†Œ)
     4 |isOdd|   true
  =====================================
  Object μžλ£Œν˜•μ˜ 데이터가 μ €μž₯λ˜λŠ” 곡간 (heap)
     10 ||   
     11 || 
     12 || 1
     13 || 2  
     14 || 3  
  μ‹€μ œ μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” λ³€μˆ˜λ₯Ό μœ„μ™€ 같이 μ €μž₯

---
  
μ›μ‹œ μžλ£Œν˜•μ΄ ν• λ‹Ήλ˜λŠ” κ²½μš°λŠ” κ°’ μžμ²΄κ°€ ν• λ‹Ήλ˜κ³ , 
μ°Έμ‘° μžλ£Œν˜•μ€ μ£Όμ†Œκ°€ ν• λ‹Ήλœλ‹€κ³  μ•”κΈ°ν•˜μ…”λ„ μ’‹μŠ΅λ‹ˆλ‹€.
  
const hello = "world"; // "world" 그 자체 
const arr = [1, 2, 3]; // [1, 2, 3] 의 λ©”λͺ¨λ¦¬ μ£Όμ†Œ xxxxxx

λ ‰μ‹œμ»¬ μŠ€μ½”ν”„ (Lexical scope)

  • λ³€μˆ˜μ™€ ν•¨μˆ˜λ₯Ό ν”„λ‘œνΌν‹°λ‘œ μ €μž₯ν•˜λŠ” 객체
  • ν•¨μˆ˜λ₯Ό μ–΄λ””μ„œ ν˜ΈμΆœν•˜λŠ”μ§€κ°€ μ•„λ‹ˆλΌ 어디에 μ„ μ–Έν•˜μ˜€λŠ”μ§€μ— 따라 κ²°μ •λ˜λŠ” 것을 λ§ν•œλ‹€.
  • 즉, ν•¨μˆ˜λ₯Ό μ–΄λ””μ„œ μ„ μ–Έν•˜μ˜€λŠ”μ§€μ— 따라 μƒμœ„ μŠ€μ½”ν”„λ₯Ό κ²°μ •ν•œλ‹€λŠ” 뜻이며, κ°€μž₯ μ€‘μš”ν•œ 점은 ν•¨μˆ˜μ˜ 호좜이 μ•„λ‹ˆλΌ ν•¨μˆ˜μ˜ 선언에 따라 κ²°μ •λœλ‹€λŠ” 점이닀.
  • λ‹€λ₯Έ 말둜, 정적 μŠ€μ½”ν”„λΌ λΆ€λ₯΄κΈ°λ„ ν•˜λ‹€.

https://developer-alle.tistory.com/407 // 쑰금 더 μžμ„Έν•œ μ„€λͺ…γ„±γ„±

ν΄λ‘œμ € (closure)

  • ν΄λ‘œμ €λŠ” ν•¨μˆ˜μ™€ κ·Έ ν•¨μˆ˜κ°€ μ„ μ–Έλ˜μ—ˆμ„ λ•Œμ˜ λ ‰μ‹œμ»¬ ν™˜κ²½(Lexical environment)과의 쑰합이라고 λΆ€λ₯΄λ©°, λ‚΄λΆ€ ν•¨μˆ˜κ°€ μ™ΈλΆ€(enclosing) ν•¨μˆ˜ λ³€μˆ˜μ— μ•‘μ„ΈμŠ€(μ ‘κ·Ό) ν•  수 μžˆλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ κΈ°λŠ₯을 λ§ν•œλ‹€.
  • μ™ΈλΆ€ ν•¨μˆ˜ λ°–μ—μ„œ λ‚΄λΆ€ ν•¨μˆ˜κ°€ ν˜ΈμΆœλ˜λ”λΌλ„ μ™ΈλΆ€ ν•¨μˆ˜μ˜ 지역 λ³€μˆ˜μ— μ ‘κ·Όν•  수 μžˆλ‹€. κ·Έ μ΄μœ λŠ” μžμ‹ μ΄ 생성될 λ•Œμ˜ ν™˜κ²½(Lexical environment)을 κΈ°μ–΅ν•˜κ³  있기 λ•Œλ¬Έμ΄λ‹€. 그렇기에 μ΄λŸ¬ν•œ ν•¨μˆ˜λ₯Ό ν΄λ‘œμ €(Closure)라고 λΆ€λ₯Έλ‹€.

this

  • μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” μ„ μ–Έν•  λ•Œ 값이 κ²°μ •λ˜λŠ” 것이 μžˆλŠ”λ° 그것을 ν΄λ‘œμ €λΌκ³  ν•˜κ³ , 반면 ν˜ΈμΆœν•˜λŠ” 방법에 μ˜ν•΄μ„œ 값이 κ²°μ •λ˜λŠ” 것이 λ°”λ‘œ this이닀.
  • thisκ°€ λ°”λ‘œ ν˜ΈμΆœν•  λ•Œ κ²°μ •λ˜λŠ” 것이고, ν˜ΈμΆœν•œ 객체가 λ°”λ‘œ this이닀.

πŸ‘©πŸ»‍πŸŽ“ slice() μ—μ„œ μ΄ˆκ³Όν•œ 인덱슀면 λΉˆλ°°μ—΄μ„ 좜λ ₯ν•œλ‹€. slice(0);λ₯Ό ν•˜λ©΄ 볡사가 λœλ‹€. ⇒ μ™„μ „ μƒˆλ‘œμš΄ μ£Όμ†Œμ˜ 배열이 λ‚˜μ˜¨λ‹€.

 

πŸ“Œ const{name} = student λŠ” const name = student.name 이건 ν‚€κ°’ κ°€μ Έμ˜€λŠ” 문법이닀

 

❓ κ°μ²΄λŠ” 길이λ₯Ό κ΅¬ν•˜λ €λ©΄?

⇒ 객체의 ν‚€μ˜ 길이λ₯Ό ꡬ해야함!

⇒ Object.keys(obj)

⇒ 킀값을 λ°°μ—΄λ‘œ 좜λ ₯

 

⇒ Object.values(obj)

⇒ 벨λ₯˜κ°’ λ°°μ—΄λ‘œ 좜λ ₯ μœ„ 두가지 λ°©λ²•μ˜ .lengthλ₯Ό λΆ™μ—¬μ„œ 좜λ ₯ν•˜λ©΄ 길이가 λ‚˜μ˜¨λ‹€

 

Array.from()  λ©”μ„œλ“œλŠ” μœ μ‚¬ λ°°μ—΄ 객체(array-like object)λ‚˜ 반볡 κ°€λŠ₯ν•œ 객체(iterable object)λ₯Ό μ–•κ²Œ 볡사해 μƒˆλ‘œμš΄Array객체λ₯Ό λ§Œλ“­λ‹ˆλ‹€.

console.log(Array.from('foo'));
// expected output: Array ["f", "o", "o"]

console.log(Array.from([1, 2, 3], x => x + x));
// expected output: Array [2, 4, 6]

Destructing(ꡬ쑰뢄해할당)

κ΅¬μ‘°λΆ„ν•΄ν• λ‹Ήμ΄λž€ λ°°μ—΄μ΄λ‚˜ 객체λ₯Ό ν•΄μ²΄ν•˜μ—¬ κ·Έ 값을 κ°œλ³„λ³€μˆ˜μ— 담을 수 μžˆκ²Œν•˜λŠ” ν‘œν˜„μ‹μ΄λ‹€.

λ°°μ—΄

배열을 λΆ„ν•΄

const array = ['apple', 'banana', 'orange', 'grapefruit']

const [first, second] = array
console.log(first) // 'apple'
console.log(second) // 'banana'

const result = []
function foo([first, second]) {
  result.push(second)
  result.push(first)
}

foo(array)
console.log(result) //['banana','apple']

μœ„μ™€ 같은 ν‘œν˜„μ‹μ„ μ“°λ©΄ λ°°μ—΄ μ•ˆμ— μžˆλŠ” 값듀을 λ³€μˆ˜μ— μž¬ν• λ‹Ήμ΄ κ°€λŠ₯ν•˜κ³ , 이 μž¬ν• λ‹Ήμ€ ν•¨μˆ˜μ˜ 인자둜 받을 λ•Œλ„ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹€.

rest/spread 문법을 λ°°μ—΄ 뢄해에 적용

const array = ['apple', 'banana', 'orange', 'grapefruit']
const [start, ...rest] = array
console.log(start) //'apple'
console.log(rest) //['banana', 'orange', 'grapefruit']

μœ„μ™€ 같은 ν‘œν˜„μ‹μœΌλ‘œλ„ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹€.단, μ•„λž˜ 같은 ν‘œν˜„μ‹μ€ μ‚¬μš©μ΄ λΆˆκ°€λŠ₯ ν•©λ‹ˆλ‹€.

// const [first, ...middle, last] = array

rest문법 λ’€μ—λŠ” μ‰Όν‘œκ°€ 올 수 μ—†λ‹€.

객체

객체의 단좕(shorthand) 문법

const name = 'κΉ€μ½”λ”©'
const age = 28

const person = {
  name,
  age,
  level: 'Junior',
}
console.log(person) // {name: 'κΉ€μ½”λ”©', age: 28, level: 'Junior'}

μœ„μ™€ 같이 λ³€μˆ˜λ₯Ό λ¨Όμ € μ„ μ–Έν•΄μ€€ λ’€, μ„ μ–Έν•œ λ³€μˆ˜λ₯Ό κ°μ²΄μ•ˆμ— 넣을 수 μžˆλ‹€.

객체 λΆ„ν•΄

const student = { name: 'κΉ€μ½”λ”©', major: '컴퓨터곡학' }

const { name } = student
// const { name } = student.name
console.log(name) //'박해컀'

λ°°μ—΄κ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ κ°μ²΄μ•ˆμ— μžˆλŠ” ν‚€λ₯Ό λ³€μˆ˜λ‘œ 킀값을 κ°’μœΌλ‘œ κ°€μ§€κ³  올 수 μžˆλ‹€.

rest/spread 문법을 객체 뢄해에 적용

λ³€μˆ˜λͺ…이 킀값일 경우 λ‹€μŒκ³Ό 같이 μ‚¬μš©ν•˜λ©΄ λœλ‹€.

let itemId = 3
let cartItems = [
    {
      itemId: 1,
      quantity: 1
    },
    {
      itemId: 5,
      quantity: 7
    },
    {
      itemId: 2,
      quantity: 3
    }
  ]
[...cartItems, {itemId, quantity: 1}]
// {itemId: itemId , quantity: 1} μ΄λ ‡κ²Œ μž‘μ„±ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€.
 // rest/spread 문법을 객체 뢄해에 적용(1)
const student1 = { name: '졜초보', major: '물리학과' }
const { name, ...args } = student

console.log(name) //'졜초보'
console.log(args) //{major:'물리학과'}

// rest/spread 문법을 객체 뢄해에 적용(2)
const student2 = { name: '졜초보', major: '물리학과', lesson: 'μ–‘μžμ—­ν•™', grade: 'B+' }

function getSummary({ name, lesson: course, grade }) {
  return `${name}λ‹˜μ€ ${grade}의 μ„±μ μœΌλ‘œ ${course}을 μˆ˜κ°•ν–ˆμŠ΅λ‹ˆλ‹€`}

console.log(getSummary(student)) //'μ΅œμ΄ˆλ³΄λ‹˜μ€ B+의 μ„±μ μœΌλ‘œ μ–‘μžμ—­ν•™μ„ μˆ˜κ°•ν–ˆμŠ΅λ‹ˆλ‹€'

λ°°μ—΄κ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ λ‹€μŒκ³Ό 같이 ν‘œν˜„λ„ κ°€λŠ₯ν•˜λ‹€.λ˜λŠ” 값을 λΆ„ν•΄ν•΄μ„œ ν• λ‹Ή ν• λ•Œ lesson: course같이 μ„ μ–Έν•΄ μ£Όλ©΄ λ³€μˆ˜λͺ…이 lesson이 μ•„λ‹Œ course둜 λ³€κ²½λ˜μ–΄ 값이 ν• λ‹Ή λœλ‹€.

이 외에도 λ³€μˆ˜λͺ… 뿐만 μ•„λ‹ˆλΌ ν• λ‹Ήλœ 값을 λ³€κ²½ν•˜λŠ”λ° μ‚¬μš©λ„ κ°€λŠ₯ν•˜λ‹€.

// rest/spread 문법을 객체 뢄해에 적용(3)
const user = {
  name: 'κΉ€μ½”λ”©',
  company: {
    name: 'Code States',
    department: 'Development',
    role: {
      name: 'Software Engineer'
    }
  },
  age: 35
}

const changedUser = { //μ „κ°œκ΅¬λ¬ΈμœΌλ‘œ 원본을 가져와 이름을 '박해컀'둜 λ‚˜μ΄λ₯Ό '20'으둜 λ³€κ²½
  ...user,
  name: '박해컀', // : λ’€λŠ” κ·Έ 값을 λ³€κ²½ν•œλ‹€λŠ” 의미
  age: 20
}

const overwriteChanges = {
  name: '박해컀',
  age: 20,
  ...user //λ³€μˆ˜ μ„ μ–Έ 이후 원본이 λΆˆλŸ¬μ™€μ§€κΈ° λ•Œλ¬Έμ— 원본과 같아진닀.
}

const changedDepartment = {
  ...user, // μ „κ°œκ΅¬λ¬Έμ„ ν†΅ν•΄μ„œ 원본 γ„±γ„±
  company: { // 원본 μ•ˆμ— μžˆλŠ” company객체의 값을 λ³€κ²½
    ...user.company, // 원본에 μžˆλŠ” company객체의 값듀을 뢈러옴
    department: 'Marketing' // 값을 λ³€κ²½
  }
}

console.log(changedUser) /*{
  name: '박해컀',
  company: {
    name: 'Code States',
    department: 'Development',
    role: {
      name: 'Software Engineer'
    }
  },
  age: 20
} */

console.log(overwriteChanges) /*{
  name: 'κΉ€μ½”λ”©',
  company: {
    name: 'Code States',
    department: 'Development',
    role: {
      name: 'Software Engineer'
    }
  },
  age: 35
}*/

console.log(changedDepartment) /*{
  name: 'κΉ€μ½”λ”©',
  company: {
    name: 'Code States',
    department: 'Marketing',
    role: {
      name: 'Software Engineer'
    }
  },
  age: 35
}*/

 


 

use strict

"use strict"λŠ” 슀크립트 μ΅œμƒλ‹¨μ΄ μ•„λ‹Œ ν•¨μˆ˜ λ³Έλ¬Έ 맨 μ•ž 에 올 μˆ˜λ„ μžˆλ‹€.

μ΄λ ‡κ²Œ ν•˜λ©΄ 였직 ν•΄λ‹Ή ν•¨μˆ˜λ§Œ 엄격 λͺ¨λ“œλ‘œ μ‹€ν–‰λœλ‹€.

엄격 λͺ¨λ“œλŠ” λŒ€κ°œ 슀크립트 전체에 μ μš©ν•œλ‹€.

"use strict"λŠ” λ°˜λ“œμ‹œ μ΅œμƒλ‹¨μ— μœ„μΉ˜!!!!!!

λ‹€μŒ μ½”λ“œμ—μ„œλŠ” 엄격 λͺ¨λ“œκ°€ ν™œμ„±ν™”X

alert("some code");
// ν•˜λ‹¨μ— μœ„μΉ˜ν•œ "use strict"λŠ” 슀크립트 상단에 μœ„μΉ˜ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ λ¬΄μ‹œλ©λ‹ˆλ‹€.

"use strict";

// 엄격 λͺ¨λ“œκ°€ ν™œμ„±ν™”λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

"use strict"의 μœ„μ—λŠ” μ£Όμ„λ§Œ μ‚¬μš©ν•  수 μžˆλ‹€ → λ‹€λ₯Έκ±° 있으면 ν™œμ„±ν™” X

 


Object.assign()  λ©”μ„œλ“œλŠ” 좜처 κ°μ²΄λ“€μ˜ λͺ¨λ“  μ—΄κ±° κ°€λŠ₯ν•œ μžμ²΄ 속성을 볡사해 λŒ€μƒ 객체에 λΆ™μ—¬λ„£μŠ΅λ‹ˆλ‹€.

κ·Έ ν›„ λŒ€μƒ 객체λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

const target = { a: 1, b: 2 };
const source = { b: 4, c: 5 };

const returnedTarget = Object.assign(target, source);

console.log(target);
// expected output: Object { a: 1, b: 4, c: 5 }

console.log(returnedTarget === target);
// expected output: true