๐ŸŽ ์˜ค๋Š˜ ํ•œ ์ผ

  • Coplit - ๊ฐ์ฒด ๋ฌธ์ œ ํ’€๊ธฐ ๋ฐ ์ œ์ถœ
  • ์›์‹œ์ž๋ฃŒํ˜•๊ณผ ์ฐธ์กฐ์ž๋ฃŒํ˜• ํ•™์Šต
  • ๋ณ€์ˆ˜์˜ ์œ ํšจ๋ฒ”์œ„(Scope)์™€ ํด๋กœ์ €(closure) ํ•™์Šต
  • socrative - ์›์‹œ์ž๋ฃŒํ˜•, ์ฐธ์กฐ์ž๋ฃŒํ˜• ํ€ด์ฆˆ ํ’€๊ธฐ
  • socrative - ์Šค์ฝ”ํ”„, ํด๋กœ์ € ํ€ด์ฆˆ ํ’€๊ธฐ

โœ ๊ธฐ์–ตํ•  ๊ฒƒ๋“ค

์›์‹œ ์ž๋ฃŒํ˜•๊ณผ ์ฐธ์กฐ ์ž๋ฃŒํ˜•

์›์‹œ์ž๋ฃŒํ˜• - String, Number, Bigint, Boolean, undefined, Symbol, (null)
์ฐธ์กฐ์ž๋ฃŒํ˜• - Array([]), Object({}), Function(function(){})

  • ์›์‹œ ์ž๋ฃŒํ˜•์ด ํ• ๋‹น๋  ๋•Œ์—๋Š” ๋ณ€์ˆ˜์— ๊ฐ’(value) ์ž์ฒด๊ฐ€ ๋‹ด๊ธฐ๊ณ , ์ฐธ์กฐ ์ž๋ฃŒํ˜•์ด ํ• ๋‹น๋  ๋•Œ๋Š” ๋ณด๊ด€ํ•จ์˜ ์ฃผ์†Œ(reference)๊ฐ€ ๋‹ด๊ธด๋‹ค.
  • ์ฐธ์กฐ ์ž๋ฃŒํ˜•์€ ๊ธฐ์กด์— ๊ณ ์ •๋œ ํฌ๊ธฐ์˜ ๋ณด๊ด€ํ•จ(call stack)์ด ์•„๋‹ˆ๋ผ, ๋™์ ์œผ๋กœ ํฌ๊ธฐ๊ฐ€ ๋ณ€ํ•˜๋Š” ํŠน๋ณ„ํ•œ ๋ณด๊ด€ํ•จ(heap)์„ ์‚ฌ์šฉํ•œ๋‹ค.

Scope

  1. Global Scope vs. Local Scope
  2. Block Scope vs. Function Scope
  3. ์ „์—ญ๋ณ€์ˆ˜์™€ window ๊ฐ์ฒด
  4. ์„ ์–ธ์—†์ด ์ดˆ๊ธฐํ™”๋œ ์ „์—ญ๋ณ€์ˆ˜ โžก Strict Mode๋ฅผ ์‚ฌ์šฉํ•˜์ž.
  • JavaScript์˜ Scope์˜ ์˜๋ฏธ์™€ ์ ์šฉ ๋ฒ”์œ„๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค
  • Local scope์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” Global scope์—์„œ ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋‹ค. --> ReferenceError ๋ฐœ์ƒ
  • JavaScript์˜ Scope ์ฃผ์š” ๊ทœ์น™
    • ์ค‘์ฒฉ ๊ทœ์น™
    • block scope(block-level scope) vs. function scope(function-level scope)
    • ์ „์—ญ ๋ณ€์ˆ˜์™€ ์ „์—ญ ๊ฐ์ฒด์˜ ์˜๋ฏธ
    • let, const, var์˜ ์ฐจ์ด
letconstvar
์œ ํšจ๋ฒ”์œ„Block ScopeBlock ScopeFunction Scope
์žฌํ• ๋‹นโญ•โŒโญ•
์žฌ์„ ์–ธโŒโŒโญ•

Closure

  • Closure์˜ ์ •์˜์™€ ํŠน์ง•
  • Closure๋ฅผ ํ™œ์šฉํ•ด์„œ ์™ธ๋ถ€ํ•จ์ˆ˜์˜ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Closure์˜ ์œ ์šฉํ•˜๊ฒŒ ์“ฐ์ด๋Š” ๋ช‡ ๊ฐ€์ง€ ์ฝ”๋”ฉ ํŒจํ„ด

๊ทธ ์™ธ

Object.keys()
๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” key๋“ค์˜ ๋ชฉ๋ก์„ ๋ฐฐ์—ด๋กœ ๋ฆฌํ„ดํ•˜๋Š” ๋ฉ”์„œ๋“œ
๊ฐ์ฒด์˜ ๋‚ด์žฅ ๋ฉ”์†Œ๋“œ๊ฐ€ ์•„๋‹Œ ๊ฐ์ฒด ์ƒ์„ฑ์ž์ธ Object๊ฐ€ ์ง์ ‘ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฉ”์†Œ๋“œ์ด๋‹ค.

Object.values()
๊ฐ์ฒด์˜ value๊ฐ’๋“ค์˜ ๋ชฉ๋ก์„ ๋ฐฐ์—ด๋กœ ๋ฆฌํ„ดํ•˜๋Š” ๋ฉ”์„œ๋“œ

Object.entries(obj)
ํ‚ค์™€ ๊ฐ’์˜ ์Œ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ๊ธธ์ด 2์งœ๋ฆฌ ๋ฐฐ์—ด์„ ๋ฆฌํ„ดํ•˜๋Š” ๋ฉ”์„œ๋“œ
์ด์ค‘๋ฐฐ์—ด์ด ๋ฆฌํ„ด๋œ๋‹ค.

๊ฐ์ฒด์— ์ƒˆ๋กœ์šด ํ‚ค-๊ฐ’ ์Œ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•

let obj = {};
// ์—ฌ๊ธฐ์— key๊ฐ€ 'age'์ด๊ณ  value๊ฐ€ 21์ธ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋œ๋‹ค.
obj.age = 21;
  • ์œ„์™€ ๊ฐ™์€ Dot notation์„ ์‚ฌ์šฉํ•œ ๋ฐฉ๋ฒ•์€ key๊ฐ’์ด ์ •์ ์ธ ๊ฒฝ์šฐ์—๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค. key๊ฐ€ ๋™์ ์ผ ๋•Œ๋Š” ์•„๋ž˜์ฒ˜๋Ÿผ Braket notation์„ ์‚ฌ์šฉํ•œ ๋ฐฉ๋ฒ•์„ ์จ์•ผ ํ•œ๋‹ค.
let obj1 = { apple: 3, orange: 5, mango: 2 };
let obj2 = { apple: 2, peach: 7 };
// obj2์—์„œ obj1์— ์—†๋Š” ํ”„๋กœํผํ‹ฐ๋งŒ ๊ณจ๋ผ์„œ obj1์— ์ถ”๊ฐ€ํ•ด์ฃผ์ž
for (let prop in obj2) {
    if (!obj1[prop]) {
      obj1[prop] = obj2[prop];
    }
  }

๋งˆ์ง€๋ง‰์— console.log(i); // --> 5 ์ธ ์ด์œ 

for๋ฌธ ์•ˆ์—์„œ console.log(i); // -->4 ๋ฅผ ํ•œ ์ดํ›„์— ์ฆ๊ฐ๋ฌธ์„ ํ•œ๋ฒˆ ๋” ๊ฑฐ์น˜๊ธฐ ๋•Œ๋ฌธ์— 5๋กœ ์ถœ๋ ฅ๋œ๋‹ค.

๐Ÿฆ’ ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•œ ์ฝ”๋“œ(๐Ÿ‘ˆ)๋Š” ์ด๋ ‡๊ฒŒ(๐Ÿ‘‰)๋„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • !arr.length === arr.length === 0
  • !obj1[key] === !(key in obj1)

๐Ÿ– Socrative

Q. ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ ํ›„, ์ฝ˜์†”์— ์ถœ๋ ฅ๋˜๋Š” args์˜ ๊ฐ’์€ ๋ฌด์—‡์ผ๊นŒ์š”?


function printMaxNums(...args) {
  console.log(args)
}

printMaxNums(10, 30, 40); // --> [10, 30, 40]

...args๋Š” rest parameter, rest syntax๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ๋‚จ์•„์žˆ๋Š” ๋ชจ๋“  ์ธ์ž๋ฅผ ํ•˜๋‚˜์˜ ๋ฐฐ์—ด์— ๋‹ด๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ ‡๊ฒŒ ๋ถ€๋ฆ…๋‹ˆ๋‹ค.
Line 3 : printMaxNums(10, 30, 40)
ํ•จ์ˆ˜ printMaxNums์˜ ์ธ์ž๋Š” ์ด 3๊ฐœ์ž…๋‹ˆ๋‹ค. ์ด ์ธ์ž๋ฅผ ๋ชจ๋‘ ํ•จ์ˆ˜ printMaxNums์— ์ „๋‹ฌํ•˜์—ฌ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

function printMaxNums(...args) {
  console.log(args)
}

์‹คํ–‰์ด ๋˜๋ฉด rest parameter args๋Š” ๋ชจ๋“  ๋‚จ์•„์žˆ๋Š” ์ธ์ž๋ฅผ ํ• ๋‹น๋ฐ›์Šต๋‹ˆ๋‹ค. ๋”ฐ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋บด๋†“์ง€ ์•Š์•˜์Œ์œผ๋กœ args๋Š” ๋ฐฐ์—ด์˜ ํ˜•ํƒœ๋กœ ๋ชจ๋“  ์ธ์ž๋ฅผ ํ• ๋‹น๋ฐ›์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋•Œ๋ฌธ์— ๋‹ต์€ [10, 30, 40], A์ž…๋‹ˆ๋‹ค.

function printMaxNums(num1, ...args) {
  console.log(args) // [30, 40]
}

๋”ฐ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ–ˆ์—ˆ๋‹ค๋ฉด, ๋‚จ์€ ๋งค๊ฐœ๋ณ€์ˆ˜๋งŒ ๋ฐฐ์—ด์˜ ํ˜•ํƒœ๋กœ rest parameter args์— ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

Q. ๋‹ค์Œ์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚จ ํ›„์— result ์˜ ๊ฐ’์€ ๋ฌด์—‡์ด ๋ ๊นŒ์š”?

let x = 10;

function outer () {  
  let x = 20;  
  function inner () {
    x = x + 10;
    return x;
  }  
  inner();
}

outer();
let result = x; // --> ๋‚ด๊ฐ€ ๊ณ ๋ฅธ ์˜ค๋‹ต: 30. ์ •๋‹ต: 10

outer ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋ฉด, outer ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„ ๋‚ด์—์„œ inner ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
inner๋Š” ๋ณ€์ˆ˜ x์˜ ๊ฐ’์— 10์„ ๋”ํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ด ๋•Œ, inner์— ์˜ํ•ด ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋Š” x๋Š” inner์˜ ๋ฐ”๋กœ ํ•œ ๋‹จ๊ณ„ ์œ„ ์Šค์ฝ”ํ”„์ธ outer์— ์†ํ•œ x์ž…๋‹ˆ๋‹ค. ์ฆ‰ inner๊ฐ€ ์‹คํ–‰๋˜๋ฉด์„œ, outerํ•จ์ˆ˜ ์Šค์ฝ”ํ”„์˜ ๋ณ€์ˆ˜ x๊ฐ’์ด 30์œผ๋กœ ๋ฐ”๋€๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ๋ณ€์ˆ˜ result์— ํ• ๋‹น๋œ ๊ฐ’์€ ์ „์—ญ ์Šค์ฝ”ํ”„์˜ x์ด๋ฏ€๋กœ, outerํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜์–ด๋„ ์•„๋ฌด๋Ÿฐ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


๐Ÿฆ„ ๋” ๊ณต๋ถ€ํ•ด์•ผ ํ•  ๊ฒƒ

  • Closure์— ๋Œ€ํ•ด ํ™•์‹คํ•˜๊ฒŒ ์ตํžˆ์ž
  • for๋ฌธ์˜ continue

๐Ÿค” ๋А๋‚€์ 

  • ๊ฐ์ฒด๋ฅผ ๋ฐฐ์—ด๋งŒํผ ์ž์œ ๋กญ๊ฒŒ ๋‹ค๋ฃจ์ง€ ๋ชปํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋А๊ผˆ๋‹ค. ์—ฐ์Šต์ด ๋”๋”๋”๋” ํ•„์š”ํ•˜๋‹ค.
  • ์–ด์ ฏ๋ฐค ๊ฟˆ์—์„œ๋„ ๋ณ€์ˆ˜๋ช…์„ ๊ฐ€์ง€๊ณ  ๊ณ ๋ฏผํ–ˆ๋Š”๋ฐ, ์˜ค๋Š˜ ๋ฌธ์ œ๋ฅผ ํ’€๋ฉด์„œ ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•œ ๋ณ€์ˆ˜๊ฐ€ ๋ ˆํผ๋Ÿฐ์Šค์™€ ์™„์ „ ๋˜‘๊ฐ™์•˜๋˜ ๋ฌธ์ œ๊ฐ€ ๋งŽ์•„์„œ ๋ฟŒ๋“ฏํ–ˆ๋‹ค. ์ง๊ด€์ ์ธ ๋ณ€์ˆ˜๋ช…์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฒ„๋ฆ‡์€ ๋‚˜์ค‘์— ํ˜‘์—…์„ ํ•  ๋•Œ์—๋„ ๋„์›€์ด ๋ ๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ๊ณ„์† ๋…ธ๋ ฅํ•˜์ž!
  • ์—ญ์‹œ ์–ด๋ ค์šด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ณผ์ •์€ ์–ธ์ œ๋‚˜ ์งœ๋ฆฟํ•˜๋‹ค. ๊ฐ์ฒด ๋งˆ์ง€๋ง‰ ๋ฌธ์ œ๊ฐ€ ๊ทธ๋žฌ๋‹ค.ใ…Žใ……ใ…Ž

๐ŸŒˆ ๋‚ด์ผ ํ•  ์ผ

  • ๋“œ๋””์–ด ๋‘๋ ค์›Œํ•˜๋˜ git์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฒ•์„ ๋ฐฐ์šด๋‹ค. ๋‚ด์ผ ๊ผญ git์„ ์ •๋ณตํ•ด๋ฒ„๋ฆฌ์ž!
  • CLI(Command Line Interface) ๊ณต๋ถ€ํ•˜๊ธฐ
  • ๊ทธ๋™์•ˆ ๋ฐฐ์› ๋˜ ๋‚ด์šฉ๋“ค ํ•œ๋ฒˆ ๋” ์ด ์ •๋ฆฌํ•˜๊ธฐ

0๊ฐœ์˜ ๋Œ“๊ธ€

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด

Powered by GraphCDN, the GraphQL CDN