ํด๋ฆฐ์ฝ”๋“œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ

    1. ๋ณ€์ˆ˜ ๋‹ค๋ฃจ๊ธฐ

    meme var

    ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŠน์„ฑ ํŒŒ์•…ํ•˜๊ธฐ

    • ๋ชฝํ‚ค ํŒจ์น˜

      • ๋Ÿฐํƒ€์ž„ ์ค‘์ธ ํ”„๋กœ๊ทธ๋žจ์˜ ๋‚ด์šฉ์ด ๋ณ€๊ฒฝ๋˜๋Š” ํ–‰๋™์„ ์˜๋ฏธํ•œ๋‹ค.
    • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์—ฌ๋Ÿฌ ์–ธ์–ด์˜ ํŠน์„ฑ์ด ํ•ฉ์ณ์กŒ๋‹ค.

      • ๋ฌธ๋ฒ•์€ ์ž๋ฐ”์™€ ๋น„์Šทํ•˜๋‹ค.
      • ๋ฌธ์ž์—ด๊ณผ ๋ฐฐ์—ด ์ •๊ทœํ‘œํ˜„์‹์€ ํŽ„๊ณผ ๋น„์Šทํ•˜๋‹ค.
      • ํ•จ์ˆ˜๋Š” ์˜คํฌ์™€ ๋น„์Šทํ•˜๋‹ค.
      • ํด๋กœ์ €์™€ ์Šค์ฝ”ํ”„ํ™”๊ฒฝ์€ ์Šคํ‚ค๋งˆ์™€ ๋น„์Šทํ•˜๋‹ค.
      • ํ”„ํ† ํ† ํƒ€์ž… ๊ฐœ๋…์€ ์…€ํ”„์—์„œ ์™”๋‹ค.
      • ์ด๋ฒคํŠธ๋Š” ํ•˜์ดํผํ† ํฌ์—์„œ ์™”๋‹ค.
    • ์ข‹์€ ์žฅ์ ๋„ ์žˆ์ง€๋งŒ, ๋‚˜์œ ๋‹จ์ ๋„ ์žˆ๋‹ค.

    var๋ฅผ ์ง€์–‘ํ•˜์ž

    • var๋Š” ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ€์ง„๋‹ค.
    • let๊ณผ const๋Š” ๋ธ”๋ก ๋‹จ์œ„ ์Šค์ฝ”ํ”„์™€ TDZ๋ผ๋Š” ํŠน์„ฑ์„ ๊ฐ€์ง„๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์•ˆ์ „ํ•ด์ง„๋‹ค.

      • let๊ณผ const๋Š” ์žฌ์„ ์–ธํ•  ์ˆ˜ ์—†๊ณ 
      • let์€ ์žฌํ• ๋‹นํ•  ์ˆ˜ ์žˆ์œผ๋‚˜, const๋Š” ์žฌํ• ๋‹นํ•  ์ˆ˜ ์—†๋‹ค.

    function scope & block scope

    var global = "์ „์—ญ"
    
    if (global === "์ „์—ญ") {
    	var global = "์ง€์—ญ"
    	console.log(global) //์ง€์—ญ
    }
    
    console.log(global) //์ง€์—ญ
    • var๋Š” ํ•จ์ˆ˜ ๋‹จ์œ„ ์Šค์ฝ”ํ”„๋ผ์„œ, ํ•จ์ˆ˜ ๋‚ด์—์„œ ์„ ์–ธ ํ• ๋‹น๋œ ๊ฒฝ์šฐ ๊ทธ ์•ˆ์—์„œ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”๋ฐ,

      • ์œ„ ์ฝ”๋“œ์—์„œ๋Š” ํ•จ์ˆ˜๊ฐ€ ์•„๋‹Œ if๋ฌธ ๋‚ด์—์„œ ์„ ์–ธ ํ• ๋‹น๋œ var๊ฐ€ ์ „์—ญ๊นŒ์ง€ ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ณ  ์žˆ๋‹ค.
    let global = "์ „์—ญ"
    
    if (global === "์ „์—ญ") {
    	let global = "์ง€์—ญ"
    	console.log(global) //์ง€์—ญ
    }
    
    console.log(global) //์ „์—ญ
    • let์„ ์‚ฌ์šฉํ•˜์ž, ๋ธ”๋ก ๋‹จ์œ„ ์„ ์–ธ ํ• ๋‹น๋œ let์€ ๋ธ”๋ก ๋‚ด์—์„œ๋งŒ ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ณ , ๋ธ”๋ก ๋ฐ”๊นฅ ์ „์—ญ์œผ๋กœ๋Š” ์˜ํ–ฅ์„ ๋ชป ๋ฏธ์นœ๋‹ค. ์œ„์—์„œ ์˜ˆ์•ฝ์–ด๋ฅผ let์„ const๋กœ ๋ฐ”๊ฟ”๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋‹ค.

    let๋ณด๋‹ค const๋ฅผ ์šฐ์„ ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ํŽธ์ด ๋‚ซ๋‹ค

    • let์„ ์“ธ ๊ฒฝ์šฐ ์žฌํ• ๋‹น์ด ๋˜์–ด ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”๋€” ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
    • const ๊ฐ์ฒด ๋‚ด ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์€ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค. const๋Š” ์žฌํ• ๋‹น๋งŒ ๊ธˆ์ง€ํ•œ๋‹ค. ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด ๊ฐ™์€ ๋ ˆํผ๋Ÿฐ์Šค ๊ฐ์ฒด๋“ค์„ ์กฐ์ž‘ํ•  ๋•Œ๋Š” ์ด์ƒ์ด ์—†๋‹ค.
    const person = {
    	name: "jang",
    	age: "30",
    }
    
    person.name = "lee"
    person.age = "22"
    
    console.log(person)
    
    /*[object Object] {
      age: "22",
      name: "lee"
    }*/

    ์ „์—ญ ๊ณต๊ฐ„ ์‚ฌ์šฉ ์ตœ์†Œํ™”

    • ์ „์—ญ๊ณต๊ฐ„ : window(๋ธŒ๋ผ์šฐ์ €), global(nodeJS) ๋“ฑโ€ฆ

      • ์ „์—ญ๊ณต๊ฐ„์€ ์ตœ์ƒ์œ„ ํ™˜๊ฒฝ์ด๋ฉฐ, ๋ธŒ๋ผ์šฐ์ €์™€ ๋…ธ๋“œJSํ™˜๊ฒฝ์— ๊ฐ๊ฐ ์žˆ๋‹ค.
    • ์™œ ์ „์—ญ ๊ณต๊ฐ„์„ ์นจ๋ฒ”ํ•˜๋ฉด ์•ˆ๋˜๋ƒ?

      • ํŒŒ์ผ์„ ๋‚˜๋ˆ ๋„ ์Šค์ฝ”ํ”„๋Š” ๋‚˜๋ˆ ์ง€์ง€ ์•Š๋Š”๋‹ค. ์ „์—ญ ๊ณต๊ฐ„์— ์นจ๋ฒ”ํ•˜์—ฌ ์ €์žฅํ•˜๋ฉด ์–ด๋””์„œ๋‚˜ ์ ‘๊ทผ๋  ์ˆ˜ ์žˆ๋‹ค.
    • ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

      1. ์• ์ดˆ์— ์ „์—ญ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค.
      2. ์ง€์—ญ๋ณ€์ˆ˜๋กœ๋งŒ ๋งŒ๋“ ๋‹ค.
      3. window,global์„ ์กฐ์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค.
      4. const, let ์„ ์‚ฌ์šฉํ•œ๋‹ค
      5. IIFE(์ฆ‰์‹œ์‹คํ–‰ํ•จ์ˆ˜), Module, Closuer, โ†’ ์Šค์ฝ”ํ”„๋ฅผ ๋‚˜๋ˆ„๊ธฐ

    ์ž„์‹œ ๋ณ€์ˆ˜ ์ œ๊ฑฐํ•˜๊ธฐ

    • ์ž„์‹œ ๋ณ€์ˆ˜๋Š” scope ์•ˆ์—์„œ ์ „์—ญ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ํ™œ์šฉ๋˜๋Š” ๋ณ€์ˆ˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

      • ์ž„์‹œ ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” ๊ฐ์ฒด๋„ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๋ฉด ์ „์—ญ ๊ณต๊ฐ„์ด๋‚˜ ๋‹ค๋ฆ„ ์—†๋Š” ์ƒํ™ฉ์ด ์˜ฌ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ด ์ž„์‹œ ๊ฐ์ฒด๊ฐ€ ๋งค์šฐ ์œ„ํ—˜ํ•œ ์š”์†Œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.
      • ์ž„์‹œ๋ณ€์ˆ˜๋Š” ๋ช…๋ นํ˜•์œผ๋กœ ๊ฐ€๋“ํ•œ ๋กœ์ง์ด๋ผ ์ข‹์ง€ ์•Š๋‹ค.
      • ์ž„์‹œ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์–ด๋””์„œ ๋ฌด์—‡์ด ์ž˜๋ชป๋๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์–ด์„œ ๋””๋ฒ„๊น… ํ•˜๊ธฐ ํž˜๋“ค๋‹ค.
      • ์ž„์‹œ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ถ”๊ฐ€์ ์ธ ์ฝ”๋“œ ์ž‘์„ฑ์˜ ์œ ํ˜น์ด ์ƒ๊ฒจ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ํž˜๋“ค๊ฒŒ ๋งŒ๋“ ๋‹ค.
    • ์ž„์‹œ๋ณ€์ˆ˜๋‚˜ ์ž„์‹œ๊ฐ์ฒด๋ฅผ ์–ด๋–ป๊ฒŒ CRUD(์กฐ์ž‘)ํ•  ์ˆ˜ ์žˆ์„๊นŒ?

      • ๋ฌผ๋ก  ํ•จ์ˆ˜๋ฅผ ๋งŽ์ด ์ชผ๊ฐœ๋ฉด ์ข‹์œผ๋‚˜, ๋” ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์€ ์ž„์‹œ๋ณ€์ˆ˜(๊ฐ์ฒด)๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ๊ฐ์ฒด๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
      • ์ž„์‹œ ๊ฐ์ฒด๊ฐ€ ์ƒ๊ธฐ๋ฉด, ์—ฌ๊ธฐ์— ๊ณ„์† ์ ‘๊ทผํ•ด์„œ ๋ญ”๊ฐ€ ๋งŒ๋“ค๊ณ  ๋„ฃ๊ณ  ์ง€์šฐ๋Š” CRUD๊ฐ€ ๋ฐ˜๋ณต๋  ์œ„ํ—˜์ด ์žˆ์–ด์„œ ์ข‹์ง€ ์•Š๋‹ค.
    • ํ•ด๊ฒฐ์ฑ…

      1. ํ•จ์ˆ˜ ๋‚˜๋ˆ„๊ธฐ
      2. ๋ฐ”๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค
      function getElements() {
      	const result = {} //์ž„์‹œ ๊ฐ์ฒด
      	;(result.title = document.querySelector(".title")),
      		(result.text = document.querySelector(".text")),
      		(result.value = document.querySelector(".value"))
      	return result
      }

      โฌ‡๏ธ ์œ„ ์ฝ”๋“œ์ฒ˜๋Ÿผ ์ž„์‹œ๊ฐ์ฒด๋ฅผ ๋‘์ง€ ๋ง๊ณ  ์•„๋ž˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ ๋ฐ”๋กœ ๊ฐ์ฒด๋กœ ๋ฐ˜ํ™˜

      function getElements() {
      	return {
      		title: document.querySelector(".title"),
      		text: document.querySelector(".text"),
      		value: document.querySelector(".value"),
      	}
      }
      1. ๊ณ ์ฐจํ•จ์ˆ˜(map, filter, reduce) ์‚ฌ์šฉ
      2. ์„ ์–ธํ˜• ์ฝ”๋“œ๋กœ ๋ฐ”๊พผ๋‹ค

    ํ˜ธ์ด์ŠคํŒ… ์ฃผ์˜ํ•˜๊ธฐ

    • ํ˜ธ์ด์ŠคํŒ…์€ ์„ ์–ธ๊ณผ ํ• ๋‹น์ด ๋ถ„๋ฆฌ๋œ ๊ฒƒ์„ ์ƒ๊ฐํ•˜๋ฉด ์‰ฝ๋‹ค. ๋Ÿฐํƒ€์ž„(์ฝ”๋“œ ๋™์ž‘) ์‹œ๊ธฐ์— ์„ ์–ธ๊ณผ ํ• ๋‹น์ด ๋ถ„๋ฆฌ๋œ๋‹ค.
    • ํ˜ธ์ด์ŠคํŒ…์€ ๋Ÿฐํƒ€์ž„ ์‹œ์— ์„ ์–ธ์„ ์ตœ์ƒ๋‹จ์œผ๋กœ ๋Œ์–ด์˜ฌ๋ ค์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.
    • ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ๋Š” ์Šค์ฝ”ํ”„ ๋™์ž‘์„ ์˜ˆ์ƒํ•˜๋Š”๋ฐ, ๋Ÿฐํƒ€์ž„์—์„œ๋Š” ์ƒ๊ฐ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ ์ด์œ ๋Š” ํ˜ธ์ด์ŠคํŒ… ๋•Œ๋ฌธ์ด๋‹ค.
    var global = 0 //var๋Š” ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ€์ง„๋‹ค
    
    function outer() {
    	console.log(global) // undefined
    	// ์œ„ ์ฝ˜์†”๋กœ๊ทธ์˜ undefined๋Š” ์•„๋ž˜์˜ var global์˜ ํ˜ธ์ด์ŠคํŒ…์ด ๋™์ž‘ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋งŒ์•ฝ ์•„๋ž˜์˜ var global = 5 ์ฝ”๋“œ๊ฐ€ ์—†์—ˆ๋‹ค๋ฉด, 1๋ผ์ธ์˜ var glboal = 0;์— ์˜ํ•ด ์ฝ˜์†”์— 0์ด ์ฐํžŒ๋‹ค.
    	var global = 5
    
    	function inner() {
    		var global = 10
    		console.log(global) // 10
    	}
    
    	inner()
    	global = 1
    	console.log(global) // 1
    }
    
    outer()
    • ํ•จ์ˆ˜๋„ ํ˜ธ์ด์ŠคํŒ…๋œ๋‹ค. ํ•จ์ˆ˜์„ ์–ธ๋ฌธ์œผ๋กœ ๋ณ€์ˆ˜๊ฐ€ ๋ฎ์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.
    • ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค ๋•Œ const๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋งŒ๋“  ํ›„ ํ•จ์ˆ˜๋ฅผ ํ• ๋‹นํ•˜๋Š” ๋ฐฉ์‹์ด ์ถ”์ฒœ๋œ๋‹ค.
    // ์•„๋ž˜์ฒ˜๋Ÿผ ํ•จ์ˆ˜ํ‘œํ˜„์‹์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋จ
    const sum = function() {
    	return 1 + 2
    }
    • ํ•ด๊ฒฐ์ฑ…

      1. var๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. const๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
      2. ํ•จ์ˆ˜๋„ ์กฐ์‹ฌํ•œ๋‹ค. ํ•จ์ˆ˜ ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•œ๋‹ค.

    2. ํƒ€์ž… ๊ฒ€์‚ฌ ๋ฐฉ๋ฒ•

    meme typeof

    typeof

    • typeof ์—ฐ์‚ฐ์ž๋Š” ๋ฌธ์ž์—ด๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    • typeof๋งŒ์œผ๋กœ ๋ชจ๋“  ํƒ€์ž… ๊ฒ€์‚ฌ๊ฐ€ ๋‹ค ์ปค๋ฒ„๋˜์ง„ ์•Š๋Š”๋‹ค.
    • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ํƒ€์ž…์„ ํฌ๊ฒŒ ๊ตฌ๋ถ„ํ•ด๋ณด๋ฉด, Primitive(์›์‹œ๊ฐ’) ์™€ Reference(์ฐธ์กฐ๊ฐ’) ์œผ๋กœ ๋‚˜๋ˆ ์ง„๋‹ค.
    • ์›์‹œ๊ฐ’์€ typeof๋กœ ์ž˜ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ์œผ๋‚˜, ์ฐธ์กฐ๊ฐ’์€ typeof๋กœ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์–ด๋ ต๋‹ค. ๋”ฐ๋ผ์„œ typeof๊ฐ€ ๋งŒ๋Šฅ์ด ์•„๋‹ˆ๋‹ค.
    • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋™์ ์œผ๋กœ ๋ณ€ํ•˜๋Š” ์–ธ์–ด์ด๊ธฐ ๋•Œ๋ฌธ์—, ํƒ€์ž…๋„ ๋™์ ์ด๋‹ค. ๋™์ ์œผ๋กœ ๋ณ€ํ•˜๋Š” ํƒ€์ž…์„ ๊ฒ€์‚ฌํ•˜๊ธฐ ์–ด๋ ค์šฐ๋ฏ€๋กœ ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

      type

    • typeof๋Š” Wrapper ๊ฐ์ฒด๋กœ ๋œ ์›์‹œ๊ฐ’๋“ค์˜ ํƒ€์ž…์„ ์›์‹œ๊ฐ’ ํƒ€์ž…์œผ๋กœ ํ‘œ์‹œํ•˜์ง€ ๋ชปํ•œ๋‹ค.

      type2

    • typeof๋Š” function๊ณผ class ๋ชจ๋‘ function์œผ๋กœ ํ‘œ์‹œํ•œ๋‹ค. (class๋Š” function์— ๋Œ€ํ•œ ๋ฌธ๋ฒ•์  ์„คํƒ•..?)
    • ๋˜ํ•œ, array, object, null์„ ๋ชจ๋‘ object ํ‘œ์‹œํ•œ๋‹ค. null์˜ ํƒ€์ž…์ด object๋กœ ํ‘œ์‹œ๋˜๋Š” ๊ฒƒ์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋„ ์ธ์ •ํ•œ ์˜ค๋ฅ˜์ด๋‹ค. type3

    instanceof

    • instanceof ์—ฐ์‚ฐ์ž๋Š” typeof ์—ฐ์‚ฐ์ž์™€ ๋น„์Šทํ•˜๋‹ค. instanceof ์—ฐ์‚ฐ์ž๋Š” ๊ฐ์ฒด์˜ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์„ ๊ฒ€์‚ฌํ•˜๋Š” ์—ฐ์‚ฐ์ž์ด๋‹ค.

      • ํ•ด๋‹น ์ธ์Šคํ„ด์Šค๊ฐ€ ์–ด๋–ค ๊ฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. type4
    • ๋ชจ๋“  ์ธ์Šคํ„ด์Šค๋Š” ๋ณธ์งˆ์ ์œผ๋กœ ๊ฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค์ด๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ํ•จ์ˆ˜, ๋ฐฐ์—ด, ๋ฐ์ดํŠธ ๊ฐ์ฒด ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์„ ํƒ€๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์ƒ์œ„์—๋Š” Object ๊ฐ€ ์žˆ๋‹ค. type5
    • ์ด๋Ÿฐ ํŠน์„ฑ ๋•Œ๋ฌธ์— ํƒ€์ž… ๊ฒ€์‚ฌ๋ฅผ ํ•˜๋Š” ๊ฒƒ์ด ๋”์šฑ ์–ด๋ ต๋‹ค. ์ด๋Ÿฌํ•œ ํƒ€์ž… ๊ฒ€์‚ฌ์— ์–ด๋ ค์›€์ด ์žˆ์–ด์„œ ๋˜ ํ•˜๋‚˜ ์ œ๊ณต๋˜๋Š” ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค.

    Object.prototype.toString.call(โ€)

    • Object.prototype.toString.call('') ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ๋ฌธ์ž์—ด ์•ˆ์— ๋Œ€๊ด„ํ˜ธ๋กœ ๋ฌถ์—ฌ์„œ ํƒ€์ž…์ด ํ‘œ์‹œ๋œ๋‹ค.

      • ์ด ๊ธฐ๋Šฅ์€ Wrapper ๊ฐ์ฒด์˜ ํƒ€์ž…๊นŒ์ง€ ์ •ํ™•ํ•˜๊ฒŒ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋‹ค.
        type6

    ์š”์•ฝ

    • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ํƒ€์ž…์€ ๋™์ ์ด๋ฏ€๋กœ, ํƒ€์ž… ๊ฒ€์‚ฌ๊ฐ€ ์–ด๋ ต๋‹ค. ๋งŽ์€ ํƒ€์ž… ๊ฒ€์‚ฌ ๋ฐฉ๋ฒ•์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์–ด๋–ค ํƒ€์ž…์„ ๊ฒ€์‚ฌํ•  ๋•Œ๋งˆ๋‹ค ๊ตฌ๊ธ€(์Šคํƒ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ๋“ฑ)์— ๊ฒ€์ƒ‰ํ•ด์„œ ๊ทธ ์ƒํ™ฉ์— ์ตœ์ ์ธ ๋ฐฉ๋ฒ•์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.(๋˜ํ•œ ์›นํŽ˜์ด์ง€๋‚˜ ๋‹ต๋ณ€๊ธ€์˜ ๊ฒŒ์‹œ์ผ์ด ์ตœ์‹ ์ธ์ง€ ํ™•์ธ)

    3. undefined์™€ null ๋น„๊ต

    undefinednull

    • undefined์™€ null์„ ์‚ฌ์šฉํ•  ๋•Œ ์—ฌ๋Ÿฌ ๊ฒฝ์šฐ์—์„œ ํ—ท๊ฐˆ๋ฆฐ๋‹ค.
    • MDN์—์„œ๋Š” ๊ฐ๊ฐ์— ๋Œ€ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•œ๋‹ค.

      • null์€ JavaScript์˜ย ์›์‹œ ๊ฐ’ย ์ค‘ ํ•˜๋‚˜๋กœ, ์–ด๋–ค ๊ฐ’์ด ์˜๋„์ ์œผ๋กœ ๋น„์–ด์žˆ์Œ์„ ํ‘œํ˜„ํ•˜๋ฉฐ ๋ถˆ๋ฆฌ์–ธ ์—ฐ์‚ฐ์—์„œ๋Š”ย ๊ฑฐ์ง“์œผ๋กœ ์ทจ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค
      • ์ „์—ญย undefinedย ์†์„ฑ์€ย [undefined]ย ์›์‹œ ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, JavaScript์˜ย ์›์‹œ ์ž๋ฃŒํ˜•ย ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.
    • null๊ณผ undefined์— ๋Œ€ํ•ด ์‚ดํŽด๋ณด์ž.

    null

    • null์— ๋Œ€ํ•ด not ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ”ผ์—ฐ์‚ฐ์ž null์„ ๋ถˆ๋ฆฐํ˜•(null์˜ ๋ถˆ๋ฆฐํ˜•์€ false)์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ๊ทธ ์—ญ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    console.log(!null) // true
    console.log(!!null) //false
    console.log(!null === true) // true
    console.log(!!null === false) // true
    • ํ•˜์ง€๋งŒ, ๊ทธ๋ƒฅ null === false ๋ฅผ ํ‰๊ฐ€ํ•ด๋ณด๋ฉด, ๋‘˜์€ ๋‹ค๋ฅด๋‹ค๊ณ  ๋ฐ˜ํ™˜๋œ๋‹คโ€ฆ
    console.log(null === false) //false
    • null์€ ์ˆ˜ํ•™์ ์œผ๋กœ๋Š” 0์ด๋‹ค.
    // null์€ ์ˆ˜ํ•™์ ์œผ๋กœ๋Š” 0์ด๋‹ค.
    console.log(null + 123) // 123

    undefined

    • undefined๋Š” ์•„๋ฌด๊ฒƒ๋„ ์ง€์ •ํ•˜์ง€ ์•Š์•˜์„ ๋•Œ ๊ธฐ๋ณธ๊ฐ’์ด๋‹ค. ์ฆ‰, ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ–ˆ์ง€๋งŒ ๊ฐ’์„ ์ •์˜(ํ• ๋‹น)ํ•˜์ง€ ์•Š์€ ๊ฒƒ์ด๋‹ค.
    let varb
    console.log(varb) // undefined
    console.log(typeof varb) // undefined
    • undefined์— ๋Œ€ํ•ด not ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด null์ฒ˜๋Ÿผ true ๋ถˆ๋ฆฐํ˜•์ด ๋œ๋‹ค.
    console.log(!undefined) // true
    console.log(!!undefined) // false
    • ํ•˜์ง€๋งŒ undefined์™€ null์ด ๊ฐ™๋ƒ๊ณ  ํ‰๊ฐ€ํ•˜๋ฉด ์—ญ์‹œ ๋‹ค๋ฅด๋‹ค๊ณ  ๋ฐ˜ํ™˜๋œ๋‹ค.
    console.log(undefined === null) // false
    • undefined๋กœ ์‚ฐ์ˆ˜๋ฅผ ํ•˜๋ฉด null๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ NaN๊ฐ€ ๋‚˜์˜จ๋‹ค.
    console.log(undefined + 123) // NaN

    ์š”์•ฝ

    • ๋”ฐ๋ผ์„œ undefined์™€ null์„ ํ•จ๊ป˜ ํ™œ์šฉํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ๋ณด๋‹ค๋Š”, ํŒ€์—์„œ ๋น„์–ด ์žˆ๋Š” ๊ฐ’์„ ๋‘˜ ์ค‘์— ๋ฌด์—‡์œผ๋กœ ํ•  ์ง€ ์ปจ๋ฒค์…˜์„ ์ •ํ•˜์—ฌ ์ผ๊ด€์„ฑ์žˆ๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

      • null๊ณผ undefined๋ฅผ ์“ธ ๋•Œ ์•„๋ž˜์™€ ๊ฐ™์€ ํŠน์„ฑ์„ ํŒŒ์•…ํ•˜๊ณ  ์กฐ์‹ฌํ•ด์•ผ ํ•œ๋‹ค.
    • null๊ณผ undefined ๋น„๊ต ์ •๋ฆฌ

      • null

        • ๊ฐ’์ด ์—†์Œ์„ ๋ช…์‹œ์ ์œผ๋กœ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ’
        • ์ˆ˜ํ•™์ ์œผ๋กœ 0์— ๊ฐ€๊น๋‹ค.
        • type์€ object์ด๋‹ค.
      • undefined

        • ๊ฐ’์ด ์ •์˜๋˜์ง€ ์•Š์•˜์„ ๋•Œ ๊ธฐ๋ณธ์œผ๋กœ ์ •ํ•ด์ง€๋Š” ๊ฐ’
        • ์ˆ˜ํ•™์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋ฉด NaN๊ฐ€ ๋‚˜์˜จ๋‹ค.
        • type์€ undefined์ด๋‹ค.

    4. qeq ์ค„์ด๊ธฐ

    meme eqeq

    ๋™๋“ฑ ์—ฐ์‚ฐ์ž(==, eqeq)

    • ๋™๋“ฑ ์—ฐ์‚ฐ์ž(== , Equality)

      • [MDN์ •์˜] : ๋™๋“ฑ ์—ฐ์‚ฐ์ž(==)๋Š” ๋‘ ๊ฐœ์˜ ํ”ผ์—ฐ์‚ฐ์ž๊ฐ€ ๋™์ผํ•œ์ง€ ํ™•์ธํ•˜๋ฉฐ, Boolean๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.ย ์ผ์น˜ ์—ฐ์‚ฐ์ž(===)์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ๋‹ค๋ฅธ ํƒ€์ž…์˜ ํ”ผ์—ฐ์‚ฐ์ž๋“ค๋ผ๋ฆฌ์˜ ๋น„๊ต๋ฅผ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.
      • โ€™=โ€˜์ด equality์ธ๋ฐ ์ด๋ฅผ ์ค„์—ฌ์„œ ๋งํ•˜๋ฉด eq์ด๊ณ , ๋™๋“ฑ์—ฐ์‚ฐ์ž๋Š” โ€™=โ€˜์ด ๋‘ ๊ฐœ์ด๋ฏ€๋กœ eqeq๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ๋„ ํ•œ๋‹ค.
    • ๋™๋“ฑ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ˜• ๋ณ€ํ™˜(type casting)์ด ์ผ์–ด๋‚œ๋‹ค.

      • ๊ฒ€์‚ฌ๋งŒ ํ–ˆ์„ ๋ฟ์ธ๋ฐ, ํ˜• ๋ณ€ํ™˜(type casting)์ด ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ์œ„ํ—˜ํ•˜๋‹ค.
      • ์ด์ฒ˜๋Ÿผ ๋Š์Šคํ•œ ๋™๋“ฑ ์—ฐ์‚ฐ์ž๋กœ ๊ฒ€์‚ฌํ•˜๋ฉด, ๋‚˜์ค‘์— ์–ด๋– ํ•œ ์˜ค๋ฅ˜๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ์ง€ ๋ชจ๋ฅด๋ฏ€๋กœ ์œ„ํ—˜ํ•˜๋‹ค.
    console.log("1" == 1) // true
    console.log(1 == true) // true

    eqeq

    ์ผ์น˜ ์—ฐ์‚ฐ์ž(===, eqeqeq)

    • ์ผ์น˜ ์—ฐ์‚ฐ์ž(===, Strict Eqaulity)

      • [MDN์ •์˜] : ์ผ์น˜ ์—ฐ์‚ฐ์ž(===)๋Š” ๋‘ ๊ฐœ์˜ ํ”ผ์—ฐ์‚ฐ์ž๊ฐ€ ๋™์ผํ•œ์ง€ ํ™•์ธํ•˜๋ฉฐ, Boolean ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋™๋“ฑ ์—ฐ์‚ฐ์ž(==)์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ๋‹ค๋ฅธ ํƒ€์ž…์˜ ํ”ผ์—ฐ์‚ฐ์ž๋ฅผ ํ•ญ์ƒ ๋‹ค๋ฅธ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•ฉ๋‹ˆ๋‹ค.
      • โ€™=โ€˜์ด equality์ธ๋ฐ ์ด๋ฅผ ์ค„์—ฌ์„œ ๋งํ•˜๋ฉด eq์ด๊ณ , ์ผ์น˜์—ฐ์‚ฐ์ž๋Š” โ€™=โ€˜์ด ์„ธ ๊ฐœ์ด๋ฏ€๋กœ eqeqeq๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ๋„ ํ•œ๋‹ค.
    console.log("1" === 1) // false
    console.log(1 === true) // false
    • ์–ด๋–ป๊ฒŒ๋“  ํ˜• ๋ณ€ํ™˜์„ ์ˆ˜๋™์œผ๋กœ ํ•œ ๋‹ค์Œ ์ผ์น˜ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•ˆ์ „ํ•˜๊ฒŒ ๊ฒ€์‚ฌํ•ด์•ผ ํ•œ๋‹ค.
    console.log(Number("1") === 1) // true
    console.log(Boolean(1) === true) // true

    eqeqeq

    ์š”์•ฝ

    • eqeq(==) ๋Œ€์‹  eqeqeq(===)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

      • ํŠนํžˆ ํ˜‘์—… ์‹œ ํ•ญ์ƒ eqeqeq๋งŒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์œผ๋ฏ€๋กœ, ์ด์™€ ๊ด€๋ จ๋œ ESLint ์„ค์ •์„ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. https://eslint.org/docs/rules/eqeqeq

    ํ˜• ๋ณ€ํ™˜ ์ฃผ์˜ํ•˜๊ธฐ

    • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํ‰๊ฐ€ํ–ˆ์„ ๋•Œ, ์•”๋ฌต์ ์œผ๋กœ ํ˜• ๋ณ€ํ™˜์ด ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋‹ค.
    console.log(11 + " ๋ฌธ์ž์™€ ๊ฒฐํ•ฉ") // '11 ๋ฌธ์ž์™€ ๊ฒฐํ•ฉ'
    console.log(!!"๋ฌธ์ž์—ด") // true
    console.log("11") // 11
    • ์•ˆ์ „ํ•˜๊ฒŒ ๋ณ€ํ™˜ํ•˜๋ ค๋ฉด, ์‚ฌ์šฉ์ž๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•œ๋‹ค. Wrapper ๊ฐ์ฒด ๋“ฑ์„ ํ™œ์šฉํ•˜์—ฌ ๋ช…์‹œ์  ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
    console.log(String(11 + " ๋ฌธ์ž์™€ ๊ฒฐํ•ฉ")) // '11 ๋ฌธ์ž์™€ ๊ฒฐํ•ฉ'
    console.log(Boolean(!!"๋ฌธ์ž์—ด")) // true
    console.log(Number("11")) // 11

    5. isNaN

    meme isNan

    isNaN()

    • isNaN = is Not A Number?

      • isNaN() ํ•จ์ˆ˜๋Š” ์–ด๋–ค ๊ฐ’์ด NaN์ธ์ง€ ํŒ๋ณ„ํ•œ๋‹ค.
      • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฐ’๊ณผ ๋‹ฌ๋ฆฌ, NaN์€ ๊ฐ™์Œ ์—ฐ์‚ฐ(==, ===)์„ ์‚ฌ์šฉํ•ด ํŒ๋ณ„ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—, NaN์„ ํŒ๋ณ„ํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ํ•„์š”ํ–ˆ๊ณ  ๊ทธ ๊ฒฐ๊ณผ isNaN ๋ฉ”์„œ๋“œ๊ฐ€ ์ƒ๊ฒผ๋‹ค. NaN์˜ type์€ number(typeof NaN => Number)์ธ๋ฐ, isNaN(NaN)์˜ ๊ฒฐ๊ณผ๋Š” true (= Not a number)๋ผ์„œ ํ—ท๊ฐˆ๋ฆด ์ˆ˜ ์žˆ๋‹ค.
      • ์ด ๋ฉ”์„œ๋“œ๋Š” ์ˆซ์ž๊ฐ€ ์•„๋‹Œ ๊ฒƒ์ด๋ƒ๊ณ  ๋ถ€์ •์„ ๋ฌป๋Š” ๊ฒƒ์ด๊ธฐ์— ๊ฒฐ๊ณผ๊ฐ’์„ ์˜ˆ์ƒํ•  ๋•Œ ํ—ท๊ฐˆ๋ฆฌ๊ธฐ ์‰ฝ๋‹ค. ๋‹จ์ˆœํ•˜๊ฒŒ, false๊ฐ€ ๋ฐ˜ํ™˜๋˜๋ฉด ์ˆซ์ž์ด๊ณ , true๊ฐ€ ๋ฐ˜ํ™˜๋˜๋ฉด ์ˆซ์ž๊ฐ€ ์•„๋‹ˆ๋‹ค๋Š” ๋œป์œผ๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.
      • ํ•˜์ง€๋งŒ ๋” ์ •ํ™•ํ•˜๊ฒŒ๋Š” "์ด ๊ฐ’์ด, ์ˆซ์ž๊ฐ’์œผ๋กœ ๊ฐ•์ œ(coercion, ๊ฐ•์ œ ํ˜• ๋ณ€ํ™˜)๋˜๋Š” ๊ฒฝ์šฐ, IEEE-754 ํ‘œ์ค€์— ๋”ฐ๋ฅธ 'Not A Number' ๊ฐ’์ธ๊ฐ€?" ๋ฅผ ๋ฌป๋Š” ๊ฒƒ์ด๋‹ค.

    [IEEE-754 ๊ฐ„๋‹จ ์„ค๋ช…] ์ปดํ“จํ„ฐ์™€ ์ธ๊ฐ„์€ 2์ง„์ˆ˜์™€ 10์ง„์ˆ˜๋ฅผ ํ†ตํ•ด ์†Œํ†ตํ•˜๋Š”๋ฐ, ์ด๋ ‡๊ฒŒ 2์ง„์ˆ˜์™€ 10์ง„์ˆ˜ ์‚ฌ์ด๋ฅผ ์™”๋‹ค๊ฐ”๋‹ค ํ•˜๋‹ค๋ณด๋ฉด ์†Œ์ˆ˜์ ์ด๋ผ๋Š” ๊ฐ„๊ทน์ด ์ƒ๊ธด๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์ด ๊ฐ„๊ทน์„ ์ปดํ“จํ„ฐ์—์„œ ๋ถ€๋™์†Œ์ˆ˜์ (๋– ๋Œ์ด ์†Œ์ˆ˜์ )์„ ํ‘œํ˜„ํ•˜๋Š” IEEE-754 ํ‘œ์ค€์„ ํ†ตํ•ด ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

    console.log(isNaN(123)) // false, ์ˆซ์ž๊ฐ€ ์•„๋‹Œ ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. ์ฆ‰, ์ˆซ์ž๊ฐ€ ๋งž๋‹ค.

    Number.isNaN()

    • isNaN๊ณผ Number.isNaN ์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ค๋ฅด๋‹ค.
    console.log(isNaN(123 + "ํ…Œ์ŠคํŠธ")) // true
    console.log(Number.isNaN(123 + "ํ…Œ์ŠคํŠธ")) // false
    • ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฌธ์ž์—ด์„ ํ”ผ์—ฐ์‚ฐ์ž๋กœ isNaN ๋ฉ”์„œ๋“œ๋ฅผ ํ•œ ๊ฒฐ๊ณผ, true ๊ฐ€ ๋‚˜์˜ค๋Š”๋ฐ ์ด๋Š” ์›๋ฆฌ์ƒ ์ž˜๋ชป๋œ ๊ฒƒ์ด๋‹ค.

      • ์ „์—ญ isNaN ๋ฉ”์„œ๋“œ๋Š” ์ด๋ฅผ ์ˆซ์ž๋กœ parsingํ•˜๋Š” ๊ฒƒ์„ ์‹คํŒจํ•˜๊ณ  NaN๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ true๊ฐ€ ํ‘œ์‹œ๋œ๋‹ค.
      • ์ด๋Ÿฌํ•œ ์‚ฌ๋ก€ ๋•Œ๋ฌธ์—, ์ „์—ญ isNaN์„ ์™„์ „ํžˆ ์‹ ๋ขฐํ•  ์ˆ˜๋Š” ์—†๋‹ค๊ณ  ํŒ๋‹จํ•˜๊ฒŒ ๋˜์–ด, ๊ทธ ๋Œ€์•ˆ์œผ๋กœ Number.isNaN ์ด ๋“ฑ์žฅํ–ˆ๋‹ค.
    isNaN("blabla") // true
    • ์ด์ฒ˜๋Ÿผ isNaN ๋Š์Šคํ•œ ๊ฒ€์‚ฌ๋ฅผ ํ•œ๋‹ค๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์–ด์„œ, ES2015์—์„œ๋ถ€ํ„ฐ ๋” ์—„๊ฒฉํ•œ ๋ฒ„์ „์ธ Number.isNaN์ด ๋„์ž…๋๋‹ค.

      • Number.isNaN() ๋ฉ”์„œ๋“œ๋Š” ์ „๋‹ฌ๋œ ๊ฐ’์ด NaN์ด๊ณ  ํƒ€์ž…์ด Number์ธ์ง€ ํ™•์ธํ•œ๋‹ค.
    Number.isNaN(NaN) // true
    Number.isNaN(Number.NaN) // true
    Number.isNaN(0 / 0) // true
    
    // ์ „์—ญ isNaN()์—์„œ๋Š” ์›๋ž˜ true ์˜€์„ ์‚ฌ๋ก€๋“ค
    Number.isNaN("NaN") // false
    Number.isNaN(undefined) // false
    Number.isNaN({}) // false
    Number.isNaN("blabla") // false
    
    // ์•„๋ž˜๋Š” ๋ชจ๋‘ false๋‹ค.
    Number.isNaN(true)
    Number.isNaN(null)
    Number.isNaN(37)
    Number.isNaN("37")
    Number.isNaN("37.37")
    Number.isNaN("")
    Number.isNaN(" ")

    ์š”์•ฝ

    • ๋”ฐ๋ผ์„œ ์—„๊ฒฉํ•œ ๋ฒ„์ „์ธ Number.isNaN ์„ ์“ฐ๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋œ๋‹ค.

    6. ๊ฒฝ๊ณ„๋ฅผ ๋‹ค๋ฃจ๋Š” ์ปจ๋ฒค์…˜

    DxVC7usWwAARYrr

    1) min-max

    function isAdult(age) {
    	if (age > 20) {
    	}
    }
    const MAX_AGE = 20 // ๊ฐ’์„ ํ•˜๋“œ์ฝ”๋”ฉํ•˜์ง€ ์•Š๊ณ  ์ƒ์ˆ˜ํ™”ํ•˜์—ฌ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์ด ์ฝ”๋“œ๋ฅผ ๋ณผ ๋•Œ ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š”๋‹ค.
    isAdult(MAX_AGE) // ๊ทธ๋Ÿฌ๋‚˜ MAX_AGE๊ฐ€ ๋œปํ•˜๋Š” ๊ฒƒ์ด ๊ทธ ์ตœ๋Œ€๊ฐ’์„ ํฌํ•จํ•˜๋Š” ๊ฑด์ง€ ์•„๋‹Œ์ง€ ์•Œ๊ธฐ ์–ด๋ ต๋‹ค.
    • ํŒ€์—์„œ min๊ณผ max์— ๋Œ€ํ•œ ๊ฐœ๋… ์ •์˜๋ฅผ ํ•จ๊ป˜ ํ•˜๊ณ  ์ปจ๋ฒค์…˜์„ ์ •ํ•ด๋‘์–ด์•ผ ํ•œ๋‹ค.

      • min, max๋Š” ๊ฐ๊ฐ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ๋ฏธ๋งŒ, ์ดˆ๊ณผ ๋˜๋Š” ์ดํ•˜, ์ด์ƒ ๋‘˜ ์ค‘์— ํ•˜๋‚˜๋กœ ํ•ด์„๋  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์†Œ์†๋œ ํŒ€์—์„œ ํ•œ ๊ฐ€์ง€๋กœ ์ •ํ•˜๊ณ  ๊ทธ ์ปจ๋ฒค์…˜์„ ๋”ฐ๋ผ์•ผ ํ•œ๋‹ค.
      • ๋˜๋Š” ์ƒ์ˆ˜ ๋„ค์ด๋ฐ์„ ํ•  ๋•Œ, MIN_NUMBER_LIMIT ๋‚˜ MIN_NUMBER_LIMIT ์ฒ˜๋Ÿผ LIMIT๋ฅผ ๋ถ™์—ฌ์ฃผ๋ฉด, ๊ทธ ๋„ค์ด๋ฐ์œผ๋กœ๋ถ€ํ„ฐ ๊ทธ ์ƒ์ˆ˜๊ฐ€ ๊ทธ ๊ฐ’์„ ํฌํ•จํ•˜์ง€ ์•Š๋Š” ๊ทธ ๊ฐ’์˜ ๋ฏธ๋งŒ, ์ดˆ๊ณผ ๋ฅผ ์ง€์นญํ•จ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. (๊ทธ๋Ÿผ์—๋„ ํ—ท๊ฐˆ๋ฆด ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํŒ€ ๋‚ด์—์„œ ์ปจ๋ฒค์…˜์„ ์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค)
    • ๋ช…์‹œ์ ์ธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ์˜์‹์ ์œผ๋กœ ๋…ธ๋ ฅํ•˜์ž.

    2) begin-end

    • begin์—์„œ ๊ฒฝ๊ณ„๋Š” ํฌํ•จ๋˜๊ณ  end์—์„œ๋Š” ๊ฒฝ๊ณ„๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š๋Š” ์•”๋ฌต์ ์ธ ๊ทœ์น™์ด ์žˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, ์—์–ด๋น„์•ค๋น„ ์‚ฌ์ดํŠธ์—์„œ๋„ ์ฒดํฌ์ธ ๋‚ ์งœ(begin)๋Š” ํฌํ•จ๋˜๊ณ  ์ฒดํฌ์•„์›ƒ ๋‚ ์งœ(end)๋Š” ํฌํ•จ๋˜์ง€ ์•Š๋Š”๋‹ค. ์‹œ์ค‘์˜ ์ˆ˜๋งŽ์€ ๋ฐ์ดํ„ฐ ํ”ผ์ปค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„ ์ด์™€ ๊ฐ™์ด begin๊ณผ end๋ฅผ ๊ตฌ๋ถ„ํ•œ๋‹ค.
    function reservationDate(beginDate, endDate) {
    	// some code...
    }
    
    reservationDate("2021-12-10", "2021-12-12")
    // ์œ„์™€ ๊ฐ™์€ ๊ฒฝ์šฐ ์˜ˆ์•ฝ์ผ์—๋Š” 2021-12-10๊ณผ 2021-12-11์„ ํฌํ•จํ•  ๊ฒƒ์„ ์˜ˆ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

    3) first-last

    • first-last๋Š” begin-end์™€ ๋‹ฌ๋ฆฌ ์–‘ ๋์˜ ๊ฒฝ๊ณ„๋ฅผ ํฌํ•จํ•œ๋‹ค.(~๋ถ€ํ„ฐ ~๊นŒ์ง€)
    range((first = 1), (last = 4))
    // 1,2,3,4๊ฐ€ ๋‹ค ํฌํ•จ๋œ๋‹ค.

    4) prefix-suffix

    • ๋„ค์ด๋ฐ ์‹œ prefix์™€ suffix๋ฅผ ์—ผ๋‘ํ•˜๋ฉด ์ข‹๋‹ค.
    • prefix

      • prefix(์ ‘๋‘์‚ฌ)๋Š” ๋ช…์‚ฌ์˜ ์•ž์— ๋ถ™๋Š”๋‹ค.
      • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ getter์™€ setter๋ฅผ ์˜ˆ๋กœ ๋“ค ์ˆ˜ ์žˆ๋‹ค.

        • set๊ณผ get์ด๋ผ๋Š” ์˜ˆ์•ฝ์–ด๋ฅผ ๋ฉ”์„œ๋“œ ์•ž์— ๋ถ™์—ฌ์ค€๋‹ค.
      • React์—์„œ๋Š” use ์ ‘๋‘์‚ฌ๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด๋ ‡๊ฒŒ ๋„ค์ด๋ฐ๋œ ๋ฉ”์„œ๋“œ๋Š” Hook์œผ๋กœ ์•ฝ์†๋˜์–ด ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
      • jQuery์—์„œ๋Š” $ ๋ฅผ ์ ‘๋‘์‚ฌ๋กœ ์“ฐ๋Š” ์•ฝ์†์ด ์žˆ๋‹ค.
      • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ES2019๋ถ€ํ„ฐ ํ•ด์‰ฌย #ย prefix ๋ฅผ ์ถ”๊ฐ€ํ•ด private class ํ•„๋“œ๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.
      • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ด€์ ์—์„œ prefix๋ฅผ ์‚ดํŽด๋ณด์ž๋ฉด, Loadsh ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ ‘๊ทผํ•  ๋•Œ underscore(_) ๋ฅผ ์ด์šฉํ•จ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
    • suffix

      • suffix(์ ‘๋ฏธ์‚ฌ)๋Š” ๋ช…์‚ฌ์˜ ๋’ค์— ๋ถ™๋Š”๋‹ค.
      • suffix๋ฅผ ํ†ตํ•ด, ์ƒํƒœ๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
    const CHECKOUT_REQUEST = "CHECKOUT_REQUEST"
    const CHECKOUT_SUCCESS = "CHECKOUT_SUCCESS"
    const CHECKOUT_FAILURE = "CHECKOUT_FAILURE"
    • ์ฝ”๋“œ๋ฅผ ์งค ๋•Œ, ์ด์™€ ๊ฐ™์ด prefix์™€ suffix๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์Šค์Šค๋กœ ๊ทœ์น™์„ ๋งŒ๋“ค๊ณ  ํŒ€๊ณผ ํ•จ๊ป˜ ๊ณต์œ ํ•˜๋ฉฐ ์ผ๊ด€๋œ ๋„ค์ด๋ฐ์„ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

    5) ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ˆœ์„œ๊ฐ€ ๊ฒฝ๊ณ„๋‹ค

    • ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜์˜ ๋„ค์ด๋ฐ๊ณผ ์ธ์ž์˜ ์ˆœ์„œ๊ฐ„์˜ ์—ฐ๊ด€์„ฑ์„ ๊ณ ๋ คํ•œ๋‹ค.
    • ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” 2๊ฐœ๊ฐ€ ๋„˜์ง€ ์•Š๋„๋ก ๋งŒ๋“ ๋‹ค.
    • ๋ถˆ๊ทœ์น™์ ์ธ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋“ค์–ด์˜จ๋‹ค๋ฉด, arguments๋‚˜ rest parameter ์‚ฌ์šฉ์„ ๊ณ ๋ คํ•œ๋‹ค.
    • ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ฐ์ฒด์— ๋‹ด์•„์„œ ๋„˜๊ธด๋‹ค. ๊ฐ์ฒด๋กœ ๋‹ด๊ธด ๋งค๊ฐœ๋ณ€์ˆ˜๋ผ๋ฉด ์ˆœ์„œ๋Š” ์ƒ๊ด€์ด ์—†๊ฒŒ ๋œ๋‹ค.
    • ์ด๋ฏธ ๋งŒ๋“  ํ•จ์ˆ˜๊ฐ€ ์žˆ๊ณ  ์ด๋ฅผ ๊ณ ์น˜๊ธฐ ์–ด๋ ต๋‹ค๋ฉด, Wrappingํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ ๋‹ค.
    function someFunc(someArg1, someArg2, someArg3, someArg4) {}
    
    function getFunc(someArg1, someArg3) {
    	someFunc(someArg1, undefined, someArg3)
    }
    // ๊ทธ ํ•จ์ˆ˜๋ฅผ ๋˜ ํ˜ธ์ถœํ•˜๋Š” ํ˜•ํƒœ์˜ ์ƒˆ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์„œ 2๊ฐœ ์ดํ•˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋งŒ ๋ฐ›๋Š”๋‹ค.

    7. ์‚ผํ•ญ์—ฐ์‚ฐ์ž ๋‹ค๋ฃจ๊ธฐ

    ternary operators ternary operators everwhere

    • ์‚ผํ•ญ์—ฐ์‚ฐ์ž๋Š” 3๊ฐœ์˜ ํ”ผ์—ฐ์‚ฐ์ž๋ฅผ ์ทจํ•œ๋‹ค.

      • ์กฐ๊ฑด ? ์ฐธ(๊ฐ’ ๋˜๋Š” ์‹) : ๊ฑฐ์ง“(๊ฐ’ ๋˜๋Š” ์‹)

    ์‚ผํ•ญ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ช…ํ™•ํ•œ ๊ธฐ์ค€์— ์˜ํ•œ ์ผ๊ด€์„ฑ์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค

    1. ์‚ผํ•ญ์—ฐ์‚ฐ์ž๋ฅผ ์ค‘์ฒฉํ•ด์„œ ๋งŽ์ด ์“ฐ๋ฉด ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง„๋‹ค. ๋ถ„๊ธฐ์กฐ๊ฑด์ด ๋งŽ๋‹ค๋ฉด ์ฐจ๋ผ๋ฆฌ switch ๋ฌธ์„ ์“ฐ๋Š” ๊ฒƒ์ด ๋‚˜์„ ์ˆ˜ ์žˆ๋‹ค
    // ์‚ผํ•ญ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ bad case
    function example() {
    	return condition1
    		? value1
    		: condition2
    		? value2
    		: condition3
    		? value3
    		: value4
    }
    
    // ์œ„ ํ•จ์ˆ˜์™€ ๋™์ผํ•œ ๋กœ์ง์œผ๋กœ if๋ฌธ ๋ฆฌํŒฉํ† ๋งํ–ˆ์œผ๋‚˜, ์ด๊ฒƒ๋„ ๊ณผ๋„ํ•˜๋‹ค.
    function example() {
    	if (condition1) {
    		return value1
    	} else if (condition2) {
    		return value2
    	} else if (condition3) {
    		return value3
    	} else {
    		return value4
    	}
    }
    
    // ๋ถ„๊ธฐ๊ฐ€ ๋งŽ์œผ๋ฉด switch๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋‚ซ๋‹ค.
    function example() {
    	switch (condition) {
    		case case1:
    			return value1
    		case case2:
    			return value2
    		case case3:
    			return value3
    		default:
    			return value4
    	}
    }
    1. ์‚ผํ•ญ์—ฐ์‚ฐ์ž๋ฅผ ์ค‘์ฒฉํ•ด ์“ด๋‹ค๋ฉด ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋ช…ํ™•ํžˆ ์•Œ ์ˆ˜ ์žˆ๋„๋ก ์†Œ๊ด„ํ˜ธ ๊ฐ์‹ธ๊ธฐ
    const example = condition1 ? (a === 0 ? "zero" : "positive") : "negative"
    1. ์‚ผํ•ญ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ์„ ํ†ตํ•ด null ๊ฐ’์ด ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์— ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋‹ค
    const welcomeMessage = isLogin => {
    	const name = isLogin ? getName() : "์ด๋ฆ„์—†์Œ" // null ๊ฐ’ ๋Œ€์‹ ์— '์ด๋ฆ„์—†์Œ' ๋ฐ˜ํ™˜
    	return `์•ˆ๋…•ํ•˜์„ธ์š” ${name}`
    }
    1. ์‚ผํ•ญ์—ฐ์‚ฐ์ž์— ๊ฐ’์ด ๋ฐ˜ํ™˜๋˜์ง€ ์•Š๋Š”(void) ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์–ต์ง€ ์ˆ์ฝ”๋”ฉ์— ๋ถˆ๊ณผํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฐจ๋ผ๋ฆฌ if๋ฌธ ์‚ฌ์šฉํ•˜๋Š” ํŽธ์ด ๋‚ซ๋‹ค
    // ์‚ผํ•ญ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ bad case
    // alert()๋Š” ๊ฐ’์€ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š”๋‹ค.
    function alertMessage(isAdult) {
    	isAdult ? alert("์ž…์žฅ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค") : alert("์ž…์žฅ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค")
    }
    
    // ์ด๋Ÿฐ ๊ฒฝ์šฐ ์‚ผํ•ญ์—ฐ์‚ฐ์ž ๋Œ€์‹  if๋ฌธ์œผ๋กœ ๋ฆฌํŒฉํ† ๋ง์ด ์ ์ ˆํ•˜๋‹ค.
    function alertMessage(isAdult) {
    	if (isAdult) {
    		alert("์ž…์žฅ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค")
    	} else {
    		alert("์ž…์žฅ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค")
    	}
    }
    1. ์‚ผํ•ญ์—ฐ์‚ฐ์ž๋Š” ์‚ผํ•ญ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•ด ๊ฐ’์„ ๋งŒ๋“ค๊ณ  ๊ทธ ๊ฐ’์„ ๋ณ€์ˆ˜๋กœ ๋‹ด์•„๋‚ผ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ ์ ˆํ•˜๋‹ค
    // ์‚ผํ•ญ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ Good Case1
    // ์‚ผํ•ญ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•ด ๊ฐ’์„ ๋งŒ๋“ค๊ณ  ๊ทธ ๊ฐ’์„ ๋ณ€์ˆ˜๋กœ ๋‹ด์•„๋‚ด๋Š” ๊ฒฝ์šฐ
    function alertMessage(isAdult) {
        const isAdult ? '์ž…์žฅ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค' : '์ž…์žฅ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค';
    
        if (isAdult) {
            // some logic
        }
    
        if (isAdult && gender === 'MAN') {
            // some logic
        }
    }
    1. ์‚ผํ•ญ์—ฐ์‚ฐ์ž๋Š” ์‚ผํ•ญ์—ฐ์‚ฐ์ž๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ’์„ ๋ฐ”๋กœ returnํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ ์ ˆํ•œ๋‹ค
    // ์‚ผํ•ญ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ Good Case2
    // ์‚ผํ•ญ์—ฐ์‚ฐ์ž๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ’์„ ๋ฐ”๋กœ returnํ•˜๋Š” ๊ฒฝ์šฐ
    function alertMessage(isAdult) {
    	return isAdult ? "์ž…์žฅ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค" : "์ž…์žฅ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค"
    }
    1. ์‚ผํ•ญ์—ฐ์‚ฐ์ž๋Š” ์ฐธ ๊ฐ’ ๋˜๋Š” ๊ฑฐ์ง“ ๊ฐ’ ๋ฐ˜ํ™˜๋งŒ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” ์‚ฌ์šฉ์ด ์ ์ ˆํ•˜์ง€ ์•Š๋‹ค.(๋Œ€์‹  truthy falsy ์‚ฌ์šฉ)

    8. truthy-falsy์™€ ๋‹จ์ถ•ํ‰๊ฐ€ ๋‹ค๋ฃจ๊ธฐ

    teacher write true or false true sabc teacher student imgfip com 62197098

    1) truthy, falsy

    • falsy ๊ฑฐ์ง“ ๊ฐ™์€ ๊ฐ’(8๊ฐœ)

      1. false
      2. 0 (์ˆซ์ž zero)
      3. -0 (์Œ์ˆ˜ zero)
      4. 0n (BigInt)
      5. "" (๋นˆ ๋ฌธ์ž์—ด)
      6. null
      7. undefined
      8. NaN
    • truthy ์ฐธ ๊ฐ™์€ ๊ฐ’

      • ๊ฑฐ์ง“ ๊ฐ™์€ ๊ฐ’(8๊ฐœ)์œผ๋กœ ์ •์˜๋œ ๊ฐ’์ด ์•„๋‹ˆ๋ฉด ๋ชจ๋‘ ์ฐธ ๊ฐ™์€ ๊ฐ’์œผ๋กœ ํ‰๊ฐ€๋œ๋‹ค.
      • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋ถˆ๋ฆฌ์–ธ ๋ฌธ๋งฅ์—์„œ ํ˜• ๋ณ€ํ™˜์ด ๋˜๋ฏ€๋กœ, ์˜ˆ๋ฅผ ๋“ค์–ด ์•„๋ž˜์™€ ๊ฐ™์€ ์ฐธ ๊ฐ™์€ ๊ฐ’์„ true๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.
    // ๋ชจ๋‘ true ์กฐ๊ฑด์œผ๋กœ์„œ if ๋ธ”๋ก ์‹คํ–‰๋œ๋‹ค.
    if (true)
    if ({}) // ๋นˆ ๋ฐฐ์—ด์ด๋‚˜ ๋นˆ ๊ฐ์ฒด๋„ ๋ชจ๋‘ true์ด๋‹ค.
    if ([])
    if (42)
    if ("0")  // string "0"์€ true์ด๋‹ค.
    if ("false")
    if (new Date())
    if (-42)
    if (12n)
    if (3.14)
    if (-3.14)
    if (Infinity)
    if (-Infinity)

    falsy ํ™œ์šฉ ์˜ˆ

    if (name === undefined || name === null) {
    	return "์‚ฌ๋žŒ์ด ์—†๋„ค์š”"
    }
    • ์œ„์™€ ๊ฐ™์ด undefined๋‚˜ null์˜ ๊ฒฝ์šฐ๋ฅผ ๊ฑฐ๋ฅด๊ธฐ ์œ„ํ•œ ์กฐ๊ฑด์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด falsy๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ฆฌํŒฉํ† ๋ง ํ•  ์ˆ˜ ์žˆ๋‹ค.
    if (!name) {
    	// falsy์— null๊ณผ undefined ํฌํ•จ๋œ๋‹ค.
    	return "์‚ฌ๋žŒ์ด ์—†๋„ค์š”"
    }

    2) ๋‹จ์ถ• ํ‰๊ฐ€

    • ๋‹จ์ถ•ํ‰๊ฐ€(short-circuit evalution) : ์ขŒํ•ญ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒดํฌํ•œ๋‹ค.

    AND ์—ฐ์‚ฐ์ž

    • AND ์—ฐ์‚ฐ์ž๋Š” ์ตœ์šฐํ•ญ์œผ๋กœ ๊ฐ€๊ธฐ ์ „๊นŒ์ง€ ๋ชจ๋‘ true์—ฌ์•ผ ์ตœ์šฐํ•ญ์œผ๋กœ ๋„๋‹ฌํ•ด์„œ ์ตœ์šฐํ•ญ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    console.log(true && true && "๋„๋‹ฌ O") // '๋„๋‹ฌ O'
    • AND ์—ฐ์‚ฐ์ž๋Š” ์ขŒํ•ญ๋ถ€ํ„ฐ ์šฐํ•ญ์œผ๋กœ ์ˆœ์ฐจ์ ์œผ๋กœ ํ‰๊ฐ€ํ•˜๋ฉด์„œ falsy ํ™•์ธํ•œ ์ฆ‰์‹œ ๊ทธ falsy์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜๋œ๋‹ค.
    console.log(true && undefined && false && null && "๋„๋‹ฌ X") // undefined

    OR ์—ฐ์‚ฐ์ž

    • OR ์—ฐ์‚ฐ์ž๋Š” ์ตœ์šฐํ•ญ์œผ๋กœ ๊ฐ€๊ธฐ ์ „๊นŒ์ง€ ๋ชจ๋‘ false์—ฌ์•ผ ์ตœ์šฐํ•ญ์œผ๋กœ ๋„๋‹ฌํ•ด์„œ ์ตœ์šฐํ•ญ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    console.log(false || false || "๋„๋‹ฌ O") // '๋„๋‹ฌ O'
    • OR ์—ฐ์‚ฐ์ž๋Š” ์ขŒํ•ญ๋ถ€ํ„ฐ ์šฐํ•ญ์œผ๋กœ ์ˆœ์ฐจ์ ์œผ๋กœ ํ‰๊ฐ€ํ•˜๋ฉด์„œ truthy๋ฅผ ํ™•์ธํ•œ ์ฆ‰์‹œ ๊ทธ truthy์ธ ๊ฐ’์„ ๋ฐ˜ํ™˜๋œ๋‹ค.
    console.log(false || "๊ฐ’1" || "๊ฐ’2" || "๋„๋‹ฌ X") // ๊ฐ’1

    ๋ฆฌํŒฉํ† ๋ง ์˜ˆ์‹œ 1

    • ๋‹จ์ถ• ํ‰๊ฐ€๋Š” ๊ธฐ๋ณธ๊ฐ’ ํ‘œํ˜„ ์‹œ์— ๊ฐ€์žฅ ์œ ์šฉํ•˜๋‹ค.
    // ์ด๋Ÿฌํ•œ ์ผ€์ด์Šค๋ฅผ
    function fetchData() {
    	if (state.data) {
    		return state.data
    	} else {
    		return "Fetching..."
    	}
    }
    • ์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ๋‹จ์ถ•ํ‰๊ฐ€๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฆฌํŒฉํ† ๋ง
    function fetchData() {
    	return state.data || "Fetching"
    	// state.data๊ฐ€ ์กด์žฌ(truthy)ํ•˜๋ฉด state.data๊ฐ€ ๋ฐ˜ํ™˜๋˜๊ณ , ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด(falsy) ์ตœ์šฐํ•ญ์˜ 'Fetching'์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    }

    ๋ฆฌํŒฉํ† ๋ง ์˜ˆ์‹œ 2

    function favoriteDog(someDog) {
    	let favoriteDog
    	if (someDog) {
    		favoriteDog = someDog
    	} else {
    		favoriteDog = "๋ƒ์˜น"
    	}
    	return favoriteDog + "์ž…๋‹ˆ๋‹ค"
    }
    
    console.log(favoriteDog()) // '๋ƒ์˜น์ž…๋‹ˆ๋‹ค'
    console.log(favoriteDog("ํฌ๋ฉ”")) // 'ํฌ๋ฉ”์ž…๋‹ˆ๋‹ค'
    • ์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ๋‹จ์ถ•ํ‰๊ฐ€๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฆฌํŒฉํ† ๋ง
    function favoriteDog(someDog) {
    	return (someDog || "๋ƒ์˜น") + "์ž…๋‹ˆ๋‹ค"
    }
    
    console.log(favoriteDog()) // '๋ƒ์˜น์ž…๋‹ˆ๋‹ค'
    console.log(favoriteDog("ํฌ๋ฉ”")) // 'ํฌ๋ฉ”์ž…๋‹ˆ๋‹ค'

    ๋ฆฌํŒฉํ† ๋ง ์˜ˆ์‹œ 3

    function getActiveUserName(user, isLogin) {
    	if (isLogin) {
    		if (user) {
    			if (user.name) {
    				return user.name
    			} else {
    				return "์ด๋ฆ„์—†์Œ"
    			}
    		}
    	}
    }
    • ์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ๋‹จ์ถ•ํ‰๊ฐ€๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฆฌํŒฉํ† ๋ง
    function getActiveUserName(user, isLogin) {
    	if (isLogin && user) {
    		return user.name || "์ด๋ฆ„์—†์Œ"
    	}
    }

    9. Else if์™€ Else๋ฅผ ํ”ผํ•˜๊ณ  Early Returnํ•˜์ž

    early return

    1) else if ํ”ผํ•˜๊ธฐ

    • else if๋ฌธ์ด ๋งˆ์น˜ ํŒŒ์ดํ”„๋ผ์ธ์ฒ˜๋Ÿผ ์•ž์˜ if๋ฌธ๊ณผ ์—ฐ๊ฒฐ๋˜์–ด ์ฐจ๋ก€๋Œ€๋กœ ์‹คํ–‰๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์•ˆ ๋œ๋‹ค.

      • else if๋ฌธ์€ else๋ฌธ ์ฒ˜๋ฆฌ๊ฐ€ ํ•œ ๋ฒˆ ๋˜๊ณ  if๋ฌธ ๋™์ž‘์ด ๋˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค.
    const x = 1
    
    if (x >= 0) {
    	console.log("x๋Š” 0๊ณผ ๊ฐ™๊ฑฐ๋‚˜ ํฌ๋‹ค")
    } else if (x > 0) {
    	console.log("x๋Š” 0๋ณด๋‹ค ํฌ๋‹ค")
    }
    // 'x๋Š” 0๊ณผ ๊ฐ™๊ฑฐ๋‚˜ ํฌ๋‹ค'
    • ์œ„ ์ฝ”๋“œ์™€ ์•„๋ž˜์˜ ์ฝ”๋“œ๋Š” ๋…ผ๋ฆฌ์ ์œผ๋กœ ๊ฐ™์œผ๋ฉฐ, ๊ฒฐ๊ณผ๋„ ๊ฐ™๋‹ค.
    const x = 1
    
    if (x >= 0) {
    	console.log("x๋Š” 0๊ณผ ๊ฐ™๊ฑฐ๋‚˜ ํฌ๋‹ค")
    } else {
    	if (x > 0) {
    		console.log("x๋Š” 0๋ณด๋‹ค ํฌ๋‹ค")
    	}
    }
    // 'x๋Š” 0๊ณผ ๊ฐ™๊ฑฐ๋‚˜ ํฌ๋‹ค'
    • else if๋ฅผ ์•„์˜ˆ ์“ฐ์ง€ ๋ง๊ณ , ์•„๋ž˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ ์ƒˆ if๋ฌธ์„ ์จ์„œ ์กฐ๊ฑด์„ ๋ถ„๋ฆฌํ•˜๋Š” ํŽธ์ด ๋ช…ํ™•ํ•˜๋‹ค
    const x = 1
    
    if (x >= 0) {
    	console.log("x๋Š” 0๊ณผ ๊ฐ™๊ฑฐ๋‚˜ ํฌ๋‹ค")
    }
    if (x > 0) {
    	console.log("x๋Š” 0๋ณด๋‹ค ํฌ๋‹ค")
    }
    // 'x๋Š” 0๊ณผ ๊ฐ™๊ฑฐ๋‚˜ ํฌ๋‹ค'
    // 'x๋Š” 0๋ณด๋‹ค ํฌ๋‹ค'
    • ์กฐ๊ฑด์ด ๋งŽ์•„์„œ else if๊ฐ€ ๋Š˜์–ด๋‚˜์•ผ ํ•  ๊ฒฝ์šฐ switch๋ฌธ์œผ๋กœ ๋Œ€์ฒดํ•˜๋Š” ๊ฒƒ์ด ๋‚ซ๋‹ค

    2) else ํ”ผํ•˜๊ธฐ

    • else๋ฅผ ์“ฐ์ง€ ์•Š์•„๋„ ์กฐ๊ฑด์ด ๋…ผ๋ฆฌ์ ์œผ๋กœ ๋ถ„๊ธฐ๋œ๋‹ค.
    function getActiveUserName(user) {
    	if (user.name) {
    		return user.name
    	} else {
    		return "์ด๋ฆ„์—†์Œ"
    	}
    }
    • ์œ„ ์ฝ”๋“œ๋Š” ์•„๋ž˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ ๋ฆฌํŒฉํ† ๋งํ•˜๋Š” ๊ฒƒ์ด ์ ์ ˆํ•˜๋‹ค.
    function getActiveUserName(user) {
    	if (user.name) {
    		return user.name
    	}
    	return "์ด๋ฆ„์—†์Œ"
    }
    • else๋ฅผ ์“ฐ์ง€ ์•Š์•„์•ผ ํ•˜๋Š” ์ด์œ ๋Š” ์Šคํƒ€์ผ์ƒ์˜ ๋ฌธ์ œ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ๋ฐ˜์ „๋œ ๋กœ์ง์„ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜๋Š” ๋…ผ๋ฆฌ์  ์œ„ํ—˜์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

      • ํ•˜๋‚˜์˜ ํ•จ์ˆ˜๊ฐ€ ๋‘ ๊ฐ€์ง€ ์ด์ƒ์˜ ๊ธฐ๋Šฅ์„ ํ•  ๋•Œ else๋ฅผ ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด, ์ด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค.
    // age๊ฐ€ 20 ๋ฏธ๋งŒ์‹œ report๋ผ๋Š” ํŠน์ˆ˜ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋ฉฐ, ์†๋‹˜์—๊ฒŒ ์ธ์‚ฌ๋ฅผ ํ•˜๋Š” ๋กœ์ง์„ ์ž‘์„ฑํ•˜๋ ค๊ณ  ํ•œ๋‹ค.
    function getHelloCustomer() {
    	if (user.age < 20) {
    		report(user)
    	} else {
    		return "์•ˆ๋…•ํ•˜์„ธ์š”"
    	}
    }
    
    // ์ด ์ฝ”๋“œ์—์„œ๋Š” else ๋•Œ๋ฌธ์—, 20์„ธ ๋ฏธ๋งŒ์—๊ฒŒ๋งŒ ์ธ์‚ฌ๋ฅผ ํ•˜์ง€ ์•Š๋Š” ์˜๋„ํ•˜์ง€ ์•Š์€ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
    • ์•„๋ž˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ else๋ฌธ์„ ์—†์• ๋ฉด, ๋‘ ๊ธฐ๋Šฅ(๋ฏธ์„ฑ๋…„์ž ํ™•์ธํ•˜์—ฌ ์‹ ๊ณ , ์†๋‹˜์—๊ฒŒ ์ธ์‚ฌ)์ด ๋ถ„๋ฆฌ๋˜์–ด ์†๋‹˜์˜ ๋‚˜์ด์— ๊ด€๊ณ„์—†์ด ์ธ์‚ฌํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์‹คํ–‰๋œ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ ๋ฆฌํŒฉํ† ๋ง ํ•˜๋Š” ๊ฒƒ์ด ์ ์ ˆํ•˜๋‹ค.
    function getHelloCustomer() {
    	if (user.age < 20) {
    		report(user)
    	}
    	return "์•ˆ๋…•ํ•˜์„ธ์š”"
    }

    3) Early Return

    Early Return ์„ค๋ช…

    • Early Return์ด๋ž€ ์กฐ๊ฑด๋ฌธ์—์„œ ๋จผ์ € Returnํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์€ ๋ถ„๋ฆฌํ•˜์—ฌ ์šฐ์„  if๋ฌธ ๋‚ด์—์„œ Returnํ•˜์—ฌ ํ•จ์ˆ˜๋ฅผ ๋ฏธ๋ฆฌ ์ข…๋ฃŒํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋’ค์˜ ์ฝ”๋“œ๋กœ ์ง„์ž…ํ•˜์ง€ ์•Š์•„ else๋ฌธ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

      • if-else๋ฌธ์ด ๋„ˆ๋ฌด ๋งŽ์œผ๋ฉด ์ฝ๊ธฐ๊ฐ€ ์–ด๋ ต๊ณ  ์กฐ๊ฑด์— ๋Œ€ํ•ด ๋ช…์‹œ์ ์ด์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋Ÿด ๋•Œ Early Return์„ ํ™œ์šฉํ•˜์—ฌ ๋ฆฌํŒฉํ† ๋งํ•  ์ˆ˜ ์žˆ๋‹ค.
      • Early Return์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๋ถ„๋ฆฌํ•˜๋ฉด ๋กœ์ง์€ ๋ณ€ํ•จ์ด ์—†์œผ๋ฉด์„œ ๊ฐ€๋…์„ฑ์ด ์ข‹๊ณ  ๋” ๋ช…์‹œ์ ์ธ ์ฝ”๋“œ๋กœ ๋ฆฌํŒฉํ† ๋ง ํ•  ์ˆ˜ ์žˆ๋‹ค.
      • ์ตœ์ƒ์œ„์— Early Return์„ ํ†ตํ•ด ๊ฑฐ๋ฅด๋Š” ๋กœ์ง์„ ๋„ฃ์œผ๋ฉด ์กฐ๊ฑด๋ฌธ ํ™•์ธ ์‹œ ๋œ ํ—ท๊ฐˆ๋ฆฐ๋‹ค.

    Early Return ์˜ˆ์ œ1

    function loginService(isLogin, user) {
    	// 1. ๋กœ๊ทธ์ธ ์—ฌ๋ถ€ ํ™•์ธ
    	if (!isLogin) {
    		// 2. ํ† ํฐ ์กด์žฌ ํ™•์ธ
    		if (checkToken()) {
    			// 3. ๊ฐ€์ž… ์—ฌ๋ถ€ ์žฌํ™•์ธ
    			if (!user.nickName) {
    				return registerUser(user)
    			} else {
    				refreshToken()
    
    				return "๋กœ๊ทธ์ธ ์„ฑ๊ณต"
    			}
    		} else {
    			throw new Error("No Token")
    		}
    	}
    }
    • ์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์•„๋ž˜์ฒ˜๋Ÿผ Early Return์œผ๋กœ ๋ฆฌํŒฉํ† ๋งํ•  ์ˆ˜ ์žˆ๋‹ค.
    function loginService(isLogin, user) {
    	// 1. ๋กœ๊ทธ์ธ ์—ฌ๋ถ€ ํ™•์ธ
    	if (isLogin) {
    		return
    	}
    	// 2. ํ† ํฐ ์กด์žฌ ํ™•์ธ
    	if (!checkToken()) {
    		throw new Error("No Token")
    	}
    	// 3. ๊ฐ€์ž… ์—ฌ๋ถ€ ์žฌํ™•์ธ
    	if (!user.nickName) {
    		return registerUser(user)
    	}
    
    	refreshToken()
    
    	return "๋กœ๊ทธ์ธ ์„ฑ๊ณต"
    }

    Early Return ์˜ˆ์ œ2

    function ์˜ค๋Š˜ํ•˜๋ฃจ(condition, weather, isJob) {
    	if (condition === "GOOD") {
    		๊ณต๋ถ€()
    		๊ฒŒ์ž„()
    		์œ ํŠœ๋ธŒ๋ณด๊ธฐ()
    
    		if (weather === "GOOD") {
    			์šด๋™()
    			๋นจ๋ž˜()
    		}
    
    		if (isJob === "GOOD") {
    			์•ผ๊ฐ„์—…๋ฌด()
    			์กฐ๊ธฐ์ทจ์ง()
    		}
    	}
    }

    ์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์•„๋ž˜์ฒ˜๋Ÿผ Early Return์œผ๋กœ ๋ฆฌํŒฉํ† ๋งํ•  ์ˆ˜ ์žˆ๋‹ค.

    function ์˜ค๋Š˜ํ•˜๋ฃจ(condition, weather, isJob) {
    	if (condition !== "GOOD") {
    		return
    	}
    
    	๊ณต๋ถ€()
    	๊ฒŒ์ž„()
    	์œ ํŠœ๋ธŒ๋ณด๊ธฐ()
    
    	if (weather !== "GOOD") {
    		์šด๋™()
    		๋นจ๋ž˜()
    	}
    
    	if (isJob === "GOOD") {
    		์•ผ๊ฐ„์—…๋ฌด()
    		์กฐ๊ธฐ์ทจ์ง()
    	}
    }

    10. ๋ถ€์ • ์กฐ๊ฑด๋ฌธ ์ง€์–‘ํ•˜๊ธฐ

    simple

    ๋ถ€์ •์กฐ๊ฑด๋ฌธ์ด ์ข‹์ง€ ์•Š์€ ์ด์œ 

    1. ๋ถ€์ •์กฐ๊ฑด๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ƒ๊ฐ์„ ์—ฌ๋Ÿฌ ๋ฒˆ ํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ๋‹ค

    if (!isNaN(3)) {
    	console.log("์ˆซ์ž์ž…๋‹ˆ๋‹ค")
    }
    // ์ˆซ์ž์ž…๋‹ˆ๋‹ค.
    • ์œ„์™€ ๊ฐ™์€ ๋ถ€์ •์กฐ๊ฑด๋ฌธ(isNaN)์ด ์‚ฌ์šฉ๋œ ์ฝ”๋“œ๋Š” ์—ฌ๋Ÿฌ ๋ฒˆ ์ƒ๊ฐํ•ด์•ผ ํ•ด์„œ ์‹ค์ˆ˜ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์•„๋ž˜์™€ ๊ฐ™์ด ๋ช…์‹œ์ ์ธ ๊ธ์ •์กฐ๊ฑด๋ฌธ(isNumber - ์ปค์Šคํ…€ํ•จ์ˆ˜) ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํŽธ์ด ์ข‹๋‹ค.
    function isNumber(num) {
    	return !Number.isNaN(num) && typeof num === "number"
    }
    
    if (isNumber(3)) {
    	console.log("์ˆซ์ž์ž…๋‹ˆ๋‹ค")
    }
    // ์ˆซ์ž์ž…๋‹ˆ๋‹ค.

    2. ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ์ž์ฒด๊ฐ€ if๋ฌธ์ด ์ฒ˜์Œ์— ์˜ค๊ณ  true๋ถ€ํ„ฐ ์‹คํ–‰์‹œํ‚ค๋Š”๋ฐ, ๋ถ€์ •์กฐ๊ฑด๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉด false์กฐ๊ฑด์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด ๋ถˆํ•„์š”ํ•˜๊ฒŒ else๋ฌธ๊นŒ์ง€ ์จ์•ผ ํ•  ์ˆ˜ ์žˆ๋‹ค

    const isCondition = true
    const isNotCondition = false
    
    if (isCondition) {
    	console.log("์ฐธ์ธ ๊ฒฝ์šฐ์—๋งŒ ์‹คํ–‰")
    }
    
    if (isNotCondition) {
    	console.log("์ฐธ์ธ ๊ฒฝ์šฐ์—๋งŒ ์‹คํ–‰")
    } else {
    	console.log("๊ฑฐ์ง“์ธ ๊ฒฝ์šฐ์—๋งŒ ์‹คํ–‰")
    }

    ์ด๋Ÿฌํ•œ ์ด์œ ๋“ค ๋•Œ๋ฌธ์— ๋ถ€์ •์กฐ๊ฑด๋ฌธ์— ๋Œ€ํ•œ ์‚ฌ์šฉ์€ ์ง€์–‘ํ•˜๊ณ  ๊ธ์ •์กฐ๊ฑด๋ฌธ ์‚ฌ์šฉ์„ ์ง€ํ–ฅํ•˜๋Š” ๋ฐฉํ–ฅ์ด ์ข‹๋‹ค.

    ๋ถ€์ •์กฐ๊ฑด๋ฌธ ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ์™ธ ๊ฒฝ์šฐ

      1. Early Return์„ ์‚ฌ์šฉํ•  ๋•Œ
      1. Form Validationํ•  ๋•Œ
      1. ๋ณด์•ˆ ๋˜๋Š” ๊ฒ€์‚ฌํ•˜๋Š” ๋กœ์ง์—์„œ

    11. ๋ช…์‹œ์ ์ธ ์ฝ”๋“œ ์ž‘์„ฑํ•˜๊ธฐ(Default Case, ์—ฐ์‚ฐ์ž)

    1) Default Case ๊ณ ๋ คํ•˜๊ธฐ

    • ์‚ฌ์šฉ์ž์˜ ์‹ค์ˆ˜๋ฅผ ์˜ˆ๋ฐฉํ•˜๊ธฐ ์œ„ํ•ด Default Case๋ฅผ ๊ณ ๋ คํ•˜๋Š” ์˜์‹์ ์ธ ๋…ธ๋ ฅ์ด ํ•„์š”ํ•˜๋‹ค

      • ํ•จ์ˆ˜์—์„œ ๋“ค์–ด์˜ค์•ผ ํ•  ์ธ์ˆ˜๊ฐ€ ์ „๋‹ฌ๋˜์ง€ ์•Š์„ ๊ฒฝ์šฐ OR ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•ˆ์ „ํ•˜๊ฒŒ Default ๊ฐ’์„ ๋ฏธ๋ฆฌ ์„ค์ •ํ•ด๋‘๋Š” ๋ฐฉ๋ฒ•์ด ๊ถŒ์žฅ๋œ๋‹ค.
    • ์˜ˆ์ œ1
    function sum(x, y) {
    	x = x || 0
    	y = y || 0
    	return x + y
    }
    
    console.log(sum()) // 0
    • ์˜ˆ์ œ2
    function registerDay(userInputDay) {
    	switch (userInputDay) {
    		case "์›”์š”์ผ": // some code
    		case "ํ™”์š”์ผ": // some code
    		case "์ˆ˜์š”์ผ": // some code
    		case "๋ชฉ์š”์ผ": // some code
    		case "๊ธˆ์š”์ผ": // some code
    		case "ํ† ์š”์ผ": // some code
    		case "์ผ์š”์ผ": // some code
    		default:
    			throw Error("์ž…๋ ฅ๊ฐ’์ด ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค")
    	}
    }
    
    registerDay("์›”ใ„น์š”์ผ") // ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ ์‹ค์ˆ˜ ์ผ€์ด์Šค
    // Error: ์ž…๋ ฅ๊ฐ’์ด ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค
    • ์˜ˆ์ œ3

      • ์˜ˆ๋ฅผ ๋“ค์–ด, parseInt() ํ•จ์ˆ˜์—์„œ ๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜(radix)์˜ ๊ธฐ๋ณธ๊ฐ’์€ 10์ด ์•„๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  10์ง„์ˆ˜ ์ •์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ ค๋Š” ์˜๋„๋กœ ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜์— 10์„ ์ƒ๋žตํ•˜๋Š” ์ž˜๋ชป๋œ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

    radix

    • ์ด๋Ÿฌํ•œ ์‚ฌ์šฉ์ž ์‹ค์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด, ์•„๋ž˜์™€ ๊ฐ™์ด parseInt() ํ•จ์ˆ˜์—์„œ radix ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ƒ๋žตํ•  ๊ฒฝ์šฐ ๊ธฐ๋ณธ๊ฐ’์„ 10์ง„์ˆ˜๋กœ ๊ฐ„์ฃผํ•˜๋Š” ์ปค์Šคํ…€ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ๋‹ค.

      function safeDecimalParseInt(number, radix) {
      	return parseInt(number, radix || 10)
      }

    2) ๋ช…์‹œ์ ์ธ ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ ์ง€ํ–ฅํ•˜๊ธฐ

    • ๋ช…์‹œ์ ์œผ๋กœ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ณ  ๋””๋ฒ„๊น…ํ•˜๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.

      • ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋จผ์ €์ธ ๋ถ€๋ถ„์„ ์†Œ๊ด„ํ˜ธ๋กœ ๋ฌถ๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค.

        ;(x + y) * z
      • ์ „์œ„์—ฐ์‚ฐ์ž๋‚˜ ํ›„์œ„์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋˜๋„๋ก ์—ฐ์‚ฐ์ž๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค.

        number--
        // ์œ„์™€ ๊ฐ™์€ ํ›„์œ„์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์•„๋ž˜์ฒ˜๋Ÿผ ๋ช…์‹œ์ ์ธ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
        number = number - 1

    12. Null ๋ณ‘ํ•ฉ ์—ฐ์‚ฐ์ž(??)

    cutecat

    Null ๋ณ‘ํ•ฉ ์—ฐ์‚ฐ์ž ์ •์˜

    • Nullish coalescing operator(Null ๋ณ‘ํ•ฉ ์—ฐ์‚ฐ์ž)

      • ๋„ ๋ณ‘ํ•ฉ ์—ฐ์‚ฐ์ž (??)ย ๋Š” ์™ผ์ชฝ ํ”ผ์—ฐ์‚ฐ์ž๊ฐ€ย nullย ๋˜๋Š”ย undefined์ผ ๋•Œ ์˜ค๋ฅธ์ชฝ ํ”ผ์—ฐ์‚ฐ์ž๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์™ผ์ชฝ ํ”ผ์—ฐ์‚ฐ์ž๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž์ด๋‹ค.

    Null ๋ณ‘ํ•ฉ ์—ฐ์‚ฐ์ž ํ•„์š”์„ฑ

    • OR ์—ฐ์‚ฐ์ž๋ฅผ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋‹จ์ถ• ํ‰๊ฐ€ํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ์— falsy ๊ฐ’ ๋•Œ๋ฌธ์— ์˜๋„์น˜ ์•Š์€ ๊ฒฐ๊ณผ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค.
    • OR ์—ฐ์‚ฐ์ž๋Š” ์™ผ์ชฝ ํ”ผ์—ฐ์‚ฐ์ž๊ฐ€ falsy ๊ฐ’์ผ ๋•Œ ์˜ค๋ฅธ์ชฝ ํ”ผ์—ฐ์‚ฐ์ž๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์™ผ์ชฝ ํ”ผ์—ฐ์‚ฐ์ž๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ˆซ์ž 0๋„ falsy๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์—, ์•„๋ž˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ 0์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์‹ถ์€ ์˜๋„์™€ ๋‹ฌ๋ฆฌ ์˜ค๋ฅธ์ชฝ ํ”ผ์—ฐ์‚ฐ์ž๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
    0 || 10 // 10
    • ์ด๋Ÿฐ ๊ฒฝ์šฐ์— ๋Œ€์•ˆ์œผ๋กœ ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด null ๋ณ‘ํ•ฉ ์—ฐ์‚ฐ์ž(??)๋‹ค.

      • null ๋ณ‘ํ•ฉ ์—ฐ์‚ฐ์ž๋Š” null๊ณผ undefined๋ฅผ ํ‰๊ฐ€ํ•  ๋•Œ๋งŒ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.
    0 ?? 10 // 0
    null ?? 10 // 10
    undefined ?? 10 // 10

    ์ฐธ๊ณ 

    • Null ๋ณ‘ํ•ฉ ์—ฐ์‚ฐ์ž๋ฅผ AND๋‚˜ OR ์—ฐ์‚ฐ์ž์™€ ์ฒด์ด๋‹ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ ์ ˆํ•˜์ง€ ์•Š๋‹ค.
    • Null ๋ณ‘ํ•ฉ ์—ฐ์‚ฐ์ž๋ฅผ ์˜ต์…”๋„ ์ฒด์ด๋‹ ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ๊ถํ•ฉ์ด ์ข‹๋‹ค.

    13. ๋“œ๋ชจ๋ฅด๊ฐ„์˜ ๋ฒ•์น™์œผ๋กœ ์กฐ๊ฑด๋ฌธ์„ ๊ฐ„๋‹จํ•˜๊ฒŒ

    ayswv35ta2f01

    ๋“œ๋ชจ๋ฅด๊ฐ„์˜ ๋ฒ•์น™

    const isValidUser = true
    const isValidToken = true
    
    if (isValidToken && isValidUser) {
    	console.log("๋กœ๊ทธ์ธ ์„ฑ๊ณต")
    }
    • ์˜ˆ๋ฅผ ๋“ค์–ด ์œ„์™€ ๊ฐ™์ด ๋กœ๊ทธ์ธ ์„ฑ๊ณต ํ™•์ธํ•˜๋Š” ์กฐ๊ฑด๋ฌธ์ด ์žˆ๋Š”๋ฐ, ๋กœ๊ทธ์ธ ์‹คํŒจ ์ผ€์ด์Šค๋ฅผ ์ถ”๊ฐ€๋กœ ๋งŒ๋“ ๋‹ค๊ณ  ํ•˜๋ฉด, ๊ธฐ์กด์˜ ์ƒ์ˆ˜๊ฐ’์„ ํ™œ์šฉํ•˜์—ฌ ์•„๋ž˜์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
    if (!(isValidToken && isValidUser)) {
    	console.log("๋กœ๊ทธ์ธ ์‹คํŒจ")
    }
    • !(isValidToken && isValidUser) ๋’ค์— ์ถ”๊ฐ€ ์—ฐ์‚ฐ์ด ๋” ๋ถ™๊ฒŒ ๋œ๋‹ค๋ฉด ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง€๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๋‹ค.

      • ๋”ฐ๋ผ์„œ ํ•ด๋‹น ์—ฐ์‚ฐ์˜ ์†Œ๊ด„ํ˜ธ๋ฅผ ํ•œ ๊บผํ’€ ๋ฒ—๊ธฐ๋Š” ๊ฒƒ์ด ์ข‹์„ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋ฅผ ์œ„ํ•ด ๋“œ๋ชจ๋ฅด๊ฐ„์˜ ๋ฒ•์น™์„ ํ™œ์šฉํ•˜์—ฌ ์ด๋ ‡๊ฒŒ !isValidToken || !isValidUser ๋ฆฌํŒฉํ† ๋งํ•  ์ˆ˜ ์žˆ๋‹ค.
    if (!isValidToken || !isValidUser) {
    	console.log("๋กœ๊ทธ์ธ ์‹คํŒจ")
    }
    • AND ๋ถ€์ •
    if (A && B) {
      // ์„ฑ๊ณต
    }
    
    ์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ์˜ ์กฐ๊ฑด์„ ๋ถ€์ •ํ•˜๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ๋“œ๋ชจ๋ฅด๊ฐ„ ๋ฒ•์น™์„ ์จ์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
    
    if (!A || !B) {
      // ์‹คํŒจ
    }
    • OR ๋ถ€์ •
    if (A || B) {
      // ์„ฑ๊ณต
    }
    
    ์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ์˜ ์กฐ๊ฑด์„ ๋ถ€์ •ํ•˜๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ๋“œ๋ชจ๋ฅด๊ฐ„ ๋ฒ•์น™์„ ์จ์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
    
    if (!A && !B) {
      // ์‹คํŒจ
    }

    14. JavaScript์˜ ๋ฐฐ์—ด์€ ๊ฐ์ฒด๋‹ค

    arrays are objects

    const arr = [1, 2, 3]
    
    arr[4] = "test"
    arr["property"] = "string value"
    arr["obj"] = {}
    arr["{}"] = [1, 2, 3]
    arr["func"] = function() {
    	return "hello"
    }
    • ์œ„์™€ ๊ฐ™์ด ๋ฐฐ์—ด์— ๋งˆ์น˜ ๊ฐ์ฒด์—์„œ key์™€ value๋ฅผ ์„ค์ •ํ•˜๋“ฏ์ด ๊ฐ’์„ ์ž…๋ ฅํ•˜๋ฉด, ๊ฐ์ฒด์ฒ˜๋Ÿผ ๊ฐ’์ด ์ž…๋ ฅ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
    console.log(arr)
    
    /* [
      1,
      2,
      3,
      <1 empty item>,
      'test',
      property: 'string value',
      obj: {},
      '{}': [ 1, 2, 3 ],
      func: [Function (anonymous)]
    ] */
    • ์‹ฌ์ง€์–ด ๋ฐฐ์—ด ๋‚ด์˜ ํ•จ์ˆ˜๋„ ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ์ฒ˜๋Ÿผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
    console.log(arr.func()) // 'hello'
    • ์ด๋Ÿฐ ํŠน์ง•์„ ์ž˜ ์ดํ•ดํ•˜๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.
    • ๊ทธ๋ฆฌ๊ณ  ๋ฐฐ์—ด ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด Array.isArray() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
    if (Array.isArray(arr)) {
    	console.log("๋ฐฐ์—ด ํ™•์ธ")
    }

    15. ๋ฐฐ์—ด ์š”์†Œ์— ์ ‘๊ทผํ•˜๊ธฐ

    destructruing

    • arr[0], arr[1] ์ฒ˜๋Ÿผ ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค๋กœ ๋ฐฐ์—ด ์š”์†Œ์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์€ ํ•ด๋‹น ์ธ๋ฑ์Šค๊ฐ€ ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ์•Œ๊ธฐ ์–ด๋ ค์›Œ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง„๋‹ค.
    const arr = [1, 2, 3]
    console.log(arr[0], arr[1]) // 1 2
    • ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, ๋ณ€์ˆ˜ ์„ ์–ธ ๋ฐ ํ• ๋‹น์‹œ ๋ฐฐ์—ด์„ ๊ตฌ์กฐ๋ถ„ํ•ดํ• ๋‹น์„ ํ•˜์—ฌ ํ•ด๋‹น ๋ฐฐ์—ด ์š”์†Œ์˜ ์—ญํ• ์„ ๋ช…์‹œ์ ์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
    const arr = [1, 2, 3]
    const [firstInput, secondInput] = arr
    console.log(firstInput, secondInput) // 1 2
    • ๋˜๋Š”, ํ•จ์ˆ˜์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์„ ๋•Œ๋ถ€ํ„ฐ ๊ตฌ์กฐ๋ถ„ํ•ดํ• ๋‹น์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค.
    const arr = [1, 2, 3]
    function test([firstInput, secondInput], name) {
    	console.log(firstInput, secondInput, name) // 1 2 'Marco'
    }
    
    test(arr, "Marco")
    • dom์—์„œ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ๊ฐ€์ง€๊ณ  ์˜ค๊ฒŒ ๋˜๋Š”๋ฐ ์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋„ ์œ„ ๋ฐฉ๋ฒ•์„ ํ™œ์šฉํ•˜๋ฉด ์ข‹๋‹ค.
    function clickGroupButton() {
    	const confirmButton = document.getElementsByTagName("button")[0]
    	const cancelButton = document.getElementsByTagName("button")[1]
    	const resetButton = document.getElementsByTagName("button")[2]
    }
    
    // ์œ„ ์ฝ”๋“œ์—์„œ ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค๋กœ ๋ฐฐ์—ด์š”์†Œ์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ตฌ์กฐ๋ถ„ํ•ดํ• ๋‹น์„ ํ†ตํ•ด ๋ฆฌํŒฉํ† ๋ง
    
    function clickGroupButton() {
    	const [
    		confirmButton,
    		cancelButton,
    		resetButton,
    	] = document.getElementsByTagName("button")
    }
    • ์‹ฌ์ง€์–ด ๋ฐฐ์—ด์˜ ์š”์†Œ๊ฐ€ ํ•˜๋‚˜๋ผ๊ณ  ํ•˜๋”๋ผ๋„ ๊ตฌ์กฐ๋ถ„ํ•ดํ• ๋‹น์„ ์จ์„œ ๋ฐฐ์—ด ์š”์†Œ์˜ ๊ธฐ๋Šฅ์„ ๋ช…์‹œ์ ์œผ๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

    16. ๋ฐฐ์—ด์˜ length์™€ ์œ ์‚ฌ๋ฐฐ์—ด๊ฐ์ฒด

    array

    1) Array.length

    • Array.length๋Š” ๋ฐฐ์—ด์˜ ๊ธธ์ด๋ณด๋‹ค๋Š” ๋ฐฐ์—ด์˜ ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค๋ฅผ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์— ๊ฐ€๊น๋‹ค.
    const arr = [1, 2, 3]
    
    console.log(arr.length) // 3
    
    arr.length = 10
    
    console.log(arr.length) // 10
    console.log(arr) // [1,2,3, , , , , , , ,]
    
    arr[15] = 4
    
    console.log(arr) // [1,2,3, , , , , , , , , , , 4]
    • ๋ฐฐ์—ด์˜ ๊ธธ์ด๋ฅผ 0์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ๋ฐฐ์—ด์ด ์ดˆ๊ธฐํ™”๋œ๋‹ค.
    const arr = [1, 2, 3]
    arr.length = 0
    console.log(arr) // []
    • Array.length์˜ ์ด๋Ÿฌํ•œ ํŠน์„ฑ์„ ์—ผ๋‘ํ•˜๊ณ  ์ฃผ์˜ํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

    2) ์œ ์‚ฌ ๋ฐฐ์—ด ๊ฐ์ฒด

    • ์œ ์‚ฌ๋ฐฐ์—ด๊ฐ์ฒด๋Š” ๋ง ๊ทธ๋Œ€๋กœ โ€˜๋ฐฐ์—ดโ€™์ด ์•„๋‹Œ โ€˜๊ฐ์ฒดโ€™์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์•„๋ž˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ, length ์†์„ฑ๊ณผ ์ธ๋ฑ์‹ฑ๋œ ์š”์†Œ๋ฅผ ๊ฐ€์ง„
    • ์œ ์‚ฌ๋ฐฐ์—ด๊ฐ์ฒด๋ฅผ Array.from() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹ ๊ธฐํ•˜๊ฒŒ๋„ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
    • ์œ ์‚ฌ ๋ฐฐ์—ด ๊ฐ์ฒด (lengthย ์†์„ฑ๊ณผ ์ธ๋ฑ์‹ฑ ๋œ ์š”์†Œ๋ฅผ ๊ฐ€์ง„ ๊ฐ์ฒด)
    const arrayLikeObject = {
    	0: "HELLO",
    	1: "WORLD",
    	length: 2,
    }
    
    console.log(Array.isArray(arrayLikeObject)) // false
    
    const arr = Array.from(arrayLikeObject)
    
    console.log(Array.isArray(arr)) // true
    console.log(arr) // [ 'HELLO', 'WORLD' ]
    • arguments๋‚˜ webAPI์˜ node list ๋„ ์œ ์‚ฌ๋ฐฐ์—ด๊ฐ์ฒด๋‹ค.
    • ์œ ์‚ฌ๋ฐฐ์—ด๊ฐ์ฒด๋Š” ๋ฐฐ์—ด์˜ ๊ณ ์ฐจํ•จ์ˆ˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

      • Array.from() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ๋ฐฐ์—ด์˜ ๊ณ ์ฐจํ•จ์ˆ˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

    17. ๋ถˆ๋ณ€์„ฑ๊ณผ ์–•์€ ๋ณต์‚ฌ, ๊นŠ์€ ๋ณต์‚ฌ

    SpongeBob clones

    ๋ถˆ๋ณ€์„ฑ๊ณผ ์–•์€ ๋ณต์‚ฌ, ๊นŠ์€ ๋ณต์‚ฌ

    • ์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด, ์›๋ณธ๋ฐฐ์—ด๋งŒ ๋ณ€๊ฒฝํ–ˆ๋Š”๋ฐ ์›๋ณธ๋ฐฐ์—ด์„ ๋ณต์‚ฌํ–ˆ๋˜ ์ƒˆ ๋ฐฐ์—ด๋„ ํ•จ๊ป˜ ๋ณ€๊ฒฝ๋˜๋Š” ์‚ฌ์‹ค์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

      • ๋ฐฐ์—ด๊ณผ ๊ฐ์ฒด๋Š” ์ด์ฒ˜๋Ÿผ ๋ณ€ํ•  ์ˆ˜ ์žˆ๋‹ค(mutable).
    const originArray = ["123", "456", "789"]
    
    const newArray = originArray
    
    originArray.push(10)
    originArray.push(11)
    originArray.push(12)
    originArray.unshift(0)
    
    console.log(newArray) // [ 0, '123', '456', '789', 10, 11, 12 ]
    • ๋”ฐ๋ผ์„œ ๋ฐฐ์—ด๊ณผ ๊ฐ์ฒด์—์„œ๋„ ๋ถˆ๋ณ€์„ฑ(immutable)์„ ์ง€ํ‚ค๋Š” ๋ฐฉ๋ฒ•์„ ๊ณ ๋ฏผํ•œ๋‹ค.

      1. ๋ฐฐ์—ด์„ ๋ณต์‚ฌํ•œ๋‹ค.
      2. ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋“ค์„ ํ™œ์šฉํ•œ๋‹ค.

    ์–•์€ ๋ณต์‚ฌ์™€ ๊นŠ์€ ๋ณต์‚ฌ

    • ์–•์€ ๋ณต์‚ฌ(shallow copy)๋ž€?

      ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•  ๋•Œ ์ฐธ์กฐ์— ์˜ํ•œ ํ• ๋‹น์ด ์ด๋ฃจ์–ด์ง€๋ฏ€๋กœ ์›๋ณธ๊ณผ ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๊ฐ–๊ฒŒ ๋˜๊ณ  ์ด๊ฒƒ์ด ์–•์€ ๋ณต์‚ฌ์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ํ•œ ๋ณ€์ˆ˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ๋‹ค๋ฅธ ๋ณ€์ˆ˜์˜ ๋ฐ์ดํ„ฐ์˜ ๊ฐ’๋„ ํ•จ๊ป˜ ๋ณ€๊ฒฝ ๋œ๋‹ค. ์ฆ‰, ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. (์›๋ณธ===์นดํ”ผ -> true)

    • ๊นŠ์€ ๋ณต์‚ฌ(deep copy)๋ž€?

      ์ฐธ์กฐ๊ฐ€ ์•„๋‹Œ ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌํ•˜์ง€๋งŒ, ๊ฐ™์€ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ๋ณ„๊ฐœ์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๊ฐ–๋Š”๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ํ•œ ๊ฐ์ฒด ๊ฐ’์˜ ๋ณ€๊ฒฝ์ด ๋‹ค๋ฅธ ๊ฐ์ฒด ๊ฐ’์˜ ๋ณ€๊ฒฝ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค. (์›๋ณธ===์นดํ”ผ ->false)

    ์›์‹œ๊ฐ’๊ณผ ์ฐธ์กฐ๊ฐ’์˜ ๋ณต์‚ฌ

         copy

    ์œ„ ์ด๋ฏธ์ง€์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋“ฏ์ด, ์›์‹œ๊ฐ’์€ ๊นŠ์€ ๋ณต์‚ฌ๋ฅผ ํ•˜์ง€๋งŒ ๊ฐ์ฒด๋Š” ์–•์€ ๋ณต์‚ฌ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ฐธ์กฐ๊ฐ’์ธ ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด์˜ ๋ถˆ๋ณ€์„ฑ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๊นŠ์€ ๋ณต์‚ฌ์˜ ๋ฐฉ๋ฒ•์„ ๊ณ ๋ฏผํ•ด์•ผ ํ•œ๋‹ค.

    ๊ฐ์ฒด๋ฅผ ๊นŠ์€ ๋ณต์‚ฌ ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํฌ๊ฒŒ 4๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

    • spread(โ€ฆ)
    • Object.assign()
    • JSON.parse(JSON.stringify(obj));
    • lodash์˜ cloneDeep ์‚ฌ์šฉ(Node.js ํ™˜๊ฒฝ)

    ํ•˜์ง€๋งŒ ์ด ์ค‘ spread(โ€ฆ)์™€ Object.assign()์€ 1 depth (ex,['a', 'b'])๊นŒ์ง€๋งŒ ๊นŠ์€ ๋ณต์‚ฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ณ , ์ค‘์ฒฉ ๋ฐฐ์—ด์˜ 2 depth ์ด์ƒ(ex, [['a', 'b'], 'c']๋ถ€ํ„ฐ๋Š” ์–•์€ ๋ณต์‚ฌ๊ฐ€ ๋˜๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ค‘์ฒฉ๋œ ๊ฐ์ฒด๋Š” ํ•ด๋‹น ๋ฌธ๋ฒ•์˜ ์žฌ๊ท€์  ํ™œ์šฉ์ด๋‚˜ ์ด๋ฅผ ์ด๋ฏธ ๊ตฌํ˜„ํ•œ loadsh ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋“ฑ์˜ ์‚ฌ์šฉ์„ ํ†ตํ•ด์„œ ๊นŠ์€ ๋ณต์‚ฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

    • 2์ฐจ์› ๋ฐฐ์—ด์— spread operator๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณต์‚ฌํ•œ ๊ฒฝ์šฐ

      • ๋ณต์‚ฌ๋œ ๋ฐฐ์—ด์€ ์›๋ณธ ๋ฐฐ์—ด์˜ 1depth์˜ ๋ณ€ํ™”์— ๋Œ€ํ•ด์„œ๋Š” ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๊ณ , 2depth ์ด์ƒ์˜ ๋ณ€ํ™”์—์„œ๋Š” ํ•จ๊ป˜ ๋ณ€ํ•˜๋Š” ๋ชจ์Šต์„ ์•„๋ž˜ ์ฝ”๋“œ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
    const originArray = ["123", "456", "789", ["hi"]]
    
    const newArray = [...originArray]
    originArray[1] = "wow"
    originArray[3][0] = ["bye"]
    
    console.log(originArray) // [ '123', 'wow', '789', [ [ 'bye' ], 'hello' ] ]
    console.log(newArray) // ['123', '456', '789', [['bye'], 'hello']];

    ์ฐธ์กฐ๊ฐ’(๋ฐฐ์—ด๊ณผ ๊ฐ์ฒด)์˜ ๋ณต์‚ฌ ์ •๋ฆฌ

    • ๋ฐฐ์—ด์˜ ๋ณต์‚ฌ

      1. ์–•์€๋ณต์‚ฌ

        • ๊ทธ๋ƒฅ ํ• ๋‹น

          • 1 depth๋ถ€ํ„ฐ ์–•์€ ๋ณต์‚ฌ๋œ๋‹ค.
        • spread operator ๋˜๋Š” slice() ๋ฉ”์„œ๋“œ

          • 1 depth๊นŒ์ง€๋Š” ๊นŠ์€ ๋ณต์‚ฌ๊ฐ€ ๋˜๋‚˜, 2depth ๋ถ€ํ„ฐ ์–•์€ ๋ณต์‚ฌ๋œ๋‹ค.
      2. ๊นŠ์€๋ณต์‚ฌ

        • spread operator ๋˜๋Š” slice() ๋ฉ”์„œ๋“œ๋ฅผ depth๋งŒํผ ์—ฌ๋Ÿฌ๋ฒˆ ๋˜๋Š” ์žฌ๊ท€์ ์œผ๋กœ ์‚ฌ์šฉ
        • JSON.parse(JSON.stringify());
        • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ(lodash์˜ cloneDeep ๋“ฑ )
    • ๊ฐ์ฒด์˜ ๋ณต์‚ฌ

      1. ์–•์€ ๋ณต์‚ฌ

        • ๊ทธ๋ƒฅ ํ• ๋‹น

          • 1 depth๋ถ€ํ„ฐ ์–•์€ ๋ณต์‚ฌ๋œ๋‹ค.
        • spread operator ๋˜๋Š” Object.assign() ๋ฉ”์„œ๋“œ

          • 1 depth๊นŒ์ง€๋Š” ๊นŠ์€ ๋ณต์‚ฌ๊ฐ€ ๋˜๋‚˜, 2depth ๋ถ€ํ„ฐ ์–•์€ ๋ณต์‚ฌ๋œ๋‹ค.
      2. ๊นŠ์€ ๋ณต์‚ฌ

        • spread operator ๋˜๋Š” Object.assign() ๋ฉ”์„œ๋“œ๋ฅผ depth๋งŒํผ ์—ฌ๋Ÿฌ๋ฒˆ ๋˜๋Š” ์žฌ๊ท€์ ์œผ๋กœ ์‚ฌ์šฉ
        • JSON.parse(JSON.stringify());
        • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ(lodash์˜ cloneDeep ๋“ฑ )
    • ์ฐธ๊ณ ๋กœ JSON.parse(JSON.stringify()) ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊นŠ์€ ๋ณต์‚ฌ๋ฅผ ํ•  ๋•Œ๋Š”, ํŠน์ • ๋ฐ์ดํ„ฐ ํƒ€์ž…(ํ•จ์ˆ˜, ์ •๊ทœํ‘œํ˜„์‹ ๋“ฑ)์ด ์ง€์›๋˜์ง€ ์•Š์œผ๋ฉฐ, ํ•ด๋‹น ๋ฉ”์†Œ๋“œ ์ž์ฒด๊ฐ€ ์žฌ๊ท€ ๋กœ์ง์ด์—ฌ์„œ ์„ฑ๋Šฅ์ด ์ข‹์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋Š” ์ ์„ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.

    18. ๋ฐฐ์—ด ๊ณ ์ฐจํ•จ์ˆ˜์—์„œ break๋‚˜ continue๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋‹ˆ

    • ๋ฐฐ์—ด ๊ณ ์ฐจํ•จ์ˆ˜(forEach, map, fliter ๋“ฑ)์—์„œ break ์™€ continue์˜ ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€ํ•˜๋‹ค. ํ•ด๋‹น ๊ณ ์ฐจํ•จ์ˆ˜๋“ค์—์„œ๋Š” ์ด๋“ค์„ ๋ฌธ๋ฒ•์ ์œผ๋กœ ์ง€์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
    const orders = ["first", "second", "third"]
    
    orders.forEach(function(order) {
    	if (order === "second") {
    		break // SyntaxError: Illegal break statement
    	}
    	console.log(order)
    })
    • ํ•ด๋‹น ๊ณ ์ฐจํ•จ์ˆ˜๋ฅผ ์“ฐ๋ฉด์„œ ๋ฐ˜๋ณต์„ ์ค‘๊ฐ„์— ๋๋‚ด์–ด ์ตœ์ ํ™”๋ฅผ ํ•˜๊ณ  ์‹ถ์œผ๋ฉด, ์กฐ๊ฑด์— ๋”ฐ๋ผ ์˜ˆ์™ธ๋ฅผ ๋˜์ง€๋Š” try catch ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.
    const orders = ["first", "second", "third"]
    
    try {
    	orders.forEach(function(order) {
    		if (order === "second") {
    			throw error
    		}
    		console.log(order)
    	})
    } catch (error) {}
    • ํ•˜์ง€๋งŒ, ์ค‘๊ฐ„์— ๋ฉˆ์ถฐ์•ผ ํ•œ๋‹ค๋ฉดย forEach()๊ฐ€ ์ ์ ˆํ•œ ๋ฐฉ๋ฒ•์ด ์•„๋‹์ง€๋„ ๋ชจ๋ฅธ๋‹ค. ์‚ฌ์‹ค ๊ทธ๋ƒฅ for๋ฌธ ์ด๋‚˜ for of ๋ฌธ, for in ๋ฌธ ์ค‘์— ์„ ํƒํ•ด์„œ ์›ํ•˜๋Š” break๋‚˜ continue๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํŽธ์ด ๋‚˜์„ ์ˆ˜ ์žˆ๋‹ค.
    • ๊ทธ๋ฆฌ๊ณ  Array์˜ every() , some() ,find(), findIndex() ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ์กฐ๊ธฐ์— ๋ฃจํ”„ ๋ฐ˜๋ณต์„ ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋“ค์€ ๋ฐฐ์—ด ์š”์†Œ๋ฅผ ํŒ๋ณ„ ํ•จ์ˆ˜์— ์ „๋‹ฌํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ์˜ ์ฐธ/๊ฑฐ์ง“ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋ฐ˜๋ณต์˜ ์ข…๋ฃŒ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค.

      • every()ย ๋ฉ”์„œ๋“œ๋Š” ๋ฐฐ์—ด ์•ˆ์˜ ๋ชจ๋“  ์š”์†Œ๊ฐ€ ์ฃผ์–ด์ง„ ํŒ๋ณ„ ํ•จ์ˆ˜๋ฅผ ํ†ต๊ณผํ•˜๋Š”์ง€ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค. Boolean ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
      • some()ย ๋ฉ”์„œ๋“œ๋Š” ๋ฐฐ์—ด ์•ˆ์˜ ์–ด๋–ค ์š”์†Œ๋ผ๋„ย ์ฃผ์–ด์ง„ ํŒ๋ณ„ ํ•จ์ˆ˜๋ฅผ ํ†ต๊ณผํ•˜๋Š”์ง€ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค.
      • find()ย ๋ฉ”์„œ๋“œ๋Š” ์ฃผ์–ด์ง„ ํŒ๋ณ„ ํ•จ์ˆ˜๋ฅผ ๋งŒ์กฑํ•˜๋Š”ย ์ฒซ ๋ฒˆ์งธ ์š”์†Œ์˜ย ๊ฐ’์„ย ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ์š”์†Œ๊ฐ€ ์—†๋‹ค๋ฉดย undefined๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
      • findIndex()ย ๋ฉ”์„œ๋“œ๋Š”ย ์ฃผ์–ด์ง„ ํŒ๋ณ„ ํ•จ์ˆ˜๋ฅผ ๋งŒ์กฑํ•˜๋Š”ย ๋ฐฐ์—ด์˜ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ์— ๋Œ€ํ•œย ์ธ๋ฑ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์กฑํ•˜๋Š” ์š”์†Œ๊ฐ€ ์—†์œผ๋ฉด -1์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    19. ๊ฐ์ฒด์˜ Computed property Name๊ณผ lookup table ํ™œ์šฉ

    keyvalue all the things

    1) Computed property Name

    • computed property name์€ ๊ฐ์ฒด์˜ key ๊ฐ’์„ ๋Œ€๊ด„ํ˜ธ ๋ฌถ์ธ ํ‘œํ˜„์‹์œผ๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ๋ฒ•์ด๋‹ค.

      • ์ฆ‰, ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„์ด ๊ณ„์‚ฐ๋  ์ˆ˜ ์žˆ๋‹ค.
    const funcName0 = "func0"
    const funcName1 = "func1"
    const funcName2 = "func2"
    
    const obj = {
    	[funcName0]() {
    		return "func0"
    	},
    	[funcName1]() {
    		return "func1"
    	},
    	[funcName2]() {
    		return "func2"
    	},
    }
    
    for (let i = 0; i < 3; i++) {
    	console.log(obj[`func${i}`])
    }
    
    /* [Function: func0]
    [Function: func1]
    [Function: func2] */

    2) object lookup table

    • object lookup table์€ ์‹ค์ œ ์žˆ๋Š” ๋ฌธ๋ฒ•์€ ์•„๋‹ˆ๋‹ค. ๋‹ค๋งŒ, ์•„๋ž˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ switch๋ฌธ์ด๋‚˜ if else๋ฌธ์ด ๋„ˆ๋ฌด ๊ธธ๊ฒŒ ๋Š˜์–ด์งˆ ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ ๋ช…์‹œ์ ์ด๋ฉฐ ํšจ์œจ์ ์ธ ์ฝ”๋“œ ์ž‘์„ฑ ๋ฐฉ์‹์„ ์ง€์นญํ•œ๋‹ค.
    function getUserType(type) {
    	switch (type) {
    		case "ADMIN":
    			return "๊ด€๋ฆฌ์ž"
    		case "INSTRUCTOR":
    			return "๊ฐ•์‚ฌ"
    		case "STUDENT":
    			return "์ˆ˜๊ฐ•์ƒ"
    		default:
    			return "ํ•ด๋‹น ์—†์Œ"
    	}
    }
    
    console.log(getUserType("INSTRUCTOR")) // ๊ฐ•์‚ฌ
    console.log(getUserType("a")) // ํ•ด๋‹น ์—†์Œ
    • switch ๋ฌธ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ์œ„ ์ฝ”๋“œ๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด object์™€ ์ƒ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ์ผ์ข…์˜ lookup table์ฒ˜๋Ÿผ ๋ฆฌํŒฉํ† ๋งํ•˜์—ฌ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    function getUserType(type) {
    	const USER_TYPE = {
    		ADMIN: "๊ด€๋ฆฌ์ž",
    		INSTRUCTOR: "๊ฐ•์‚ฌ",
    		STUDENT: "์ˆ˜๊ฐ•์ƒ",
    		UNDEFINED: "ํ•ด๋‹น ์—†์Œ",
    	}
    
    	return USER_TYPE[type] ?? USER_TYPE.UNDEFINED
    }
    
    console.log(getUserType("INSTRUCTOR")) // ๊ฐ•์‚ฌ
    console.log(getUserType("a")) // ํ•ด๋‹น ์—†์Œ

    20. ๊ฐ์ฒด ๊ตฌ์กฐ๋ถ„ํ•ดํ• ๋‹น

    5xvvb0

    ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๊ฐ์ฒด ๊ตฌ์กฐ๋ถ„ํ•ดํ• ๋‹น

    function Person(name, age, location) {
    	this.name = name
    	this.age = age
    	this.location = location
    }
    
    const marco = new Person("Marco", 30, "Korea")
    • ์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์•„๋ž˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ ๊ตฌ์กฐ๋ถ„ํ•ดํ• ๋‹น์„ ํ™œ์šฉํ•˜์—ฌ ๋ฆฌํŒฉํ† ๋ง ํ•  ์ˆ˜ ์žˆ๋‹ค.

      • ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ฐ์ฒด๋กœ ๋ฐ›๊ณ , ์ธ์ˆ˜๋ฅผ ๊ฐ์ฒด๋กœ ์ „๋‹ฌํ•œ๋‹ค๋ฉด, ์ „๋‹ฌํ•˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์“ธ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ key๋งŒ ๊ฐ™์œผ๋ฉด ๋˜๋ฏ€๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ˆœ์„œ๊ฐ€ ๋‹ค๋ฅด๋”๋ผ๋„ ์ƒ๊ด€ ์—†๋‹ค.
    function Person({ name, age, location }) {
    	this.age = age
    	this.name = name
    	this.location = location
    }
    
    const marco = new Person({ name: "Marco", age: 30, location: "Korea" })

    ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ค‘ ์˜ต์…˜ ๋ช…์‹œ

    • ๋˜ํ•œ ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ค‘ ์˜ต์…˜์ด ๋ฌด์—‡์ธ์ง€ ์•Œ๋ ค์ฃผ๋Š” ๋ฐ๋„ ์œ ์šฉํ•˜๋‹ค.

      • ์•„๋ž˜ ์ฝ”๋“œ์˜ ํ•จ์ˆ˜์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ค‘ name์€ ํ•„์ˆ˜์ ์ด๋ผ๋Š” ๊ฒƒ์„ ๋ช…์‹œ์ ์œผ๋กœ ๋ณด์—ฌ์ฃผ๊ณ , ๊ฐ์ฒด๋กœ ๋ฌถ์ธ ๋งค๊ฐœ๋ณ€์ˆ˜ {age, location}๋Š” ๊ทธ ํ˜•ํƒœ๋ฅผ ํ†ตํ•ด ์˜ต์…˜์ž„์„ ์•Œ๋ ค์ค€๋‹ค.
    function Person(name, { age, location }) {
    	this.age = age
    	this.name = name
    	this.location = location
    }
    
    const options = {
    	age: 30,
    	location: "Korea",
    }
    
    const Marco = new Person("Marco", options)
    const orders = ["first", "second", "third"]

    ๋ฐฐ์—ด์—์„œ๋„ ๊ฐ์ฒด ๊ตฌ์กฐ๋ถ„ํ•ดํ• ๋‹น

    • ๋ฐฐ์—ด์— ๋Œ€ํ•ด์„œ๋„ ๊ตฌ์กฐ๋ถ„ํ•ดํ• ๋‹น์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.
    const orders = ["first", "second", "third"]
    
    const st1 = orders[0]
    const rd1 = orders[2]
    
    console.log(st1) // first
    console.log(rd1) // third
    • ์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ์—์„œ ๋ฐฐ์—ด์˜ ์š”์†Œ๋ฅผ ์„ ํƒํ•  ๋•Œ, ์•„๋ž˜์ฒ˜๋Ÿผ ๊ฐ์ฒด๋กœ ๊ตฌ์กฐ๋ถ„ํ•ดํ• ๋‹นํ•˜๋ฉด ๋” ๋ช…์‹œ์ ์œผ๋กœ ์„ ํƒํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    const orders = ["first", "second", "third"]
    
    const { 0: st2, 2: rd2 } = orders // ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค๋ฅผ key๋กœ ๊ฐ์ฒด๊ตฌ์กฐ๋ถ„ํ•ดํ• ๋‹นํ•œ๋‹ค
    
    console.log(st2) // first
    console.log(rd2) // third

    21. ๊ฐ์ฒด ๋ณ€๊ฒฝ ๋ฐฉ์ง€ ๋ฉ”์„œ๋“œ

    freeze

    • ๊ฐ์ฒด ๋ณ€๊ฒฝ ๋ฐฉ์ง€ ๋ฉ”์„œ๋“œ

      • ๊ฐ์ฒด ํ™•์žฅ ๊ธˆ์ง€ : Object.preventExtensions(), ํ™•์žฅ์ด ๊ธˆ์ง€๋œ ๊ฐ์ฒด๋Š” ํ”„๋กœํผํ‹ฐ ์ถ”๊ฐ€๊ฐ€ ๊ธˆ์ง€๋œ๋‹ค.
      • ๊ฐ์ฒด ๋ฐ€๋ด‰ : Object.seal(), ๋ฐ€๋ด‰๋œ ๊ฐ์ฒด๋Š” ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค
      • ๊ฐ์ฒด ๋™๊ฒฐ : Object.freeze(), ๋™๊ฒฐ๋œ ๊ฐ์ฒด๋Š” ์ฝ๊ธฐ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.
    • ๊ฐ์ฒด๊ฐ€ ์ž˜ ๋™๊ฒฐ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด, Object.isFrozen()๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ˜ํ™˜๋œ ๋ถˆ๋ฆฐ๊ฐ’์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๊ทธ๋Ÿฐ๋ฐ Object.freeze()๋„ 2 depth ์ด์ƒ์˜ ์ค‘์ฒฉ๋œ ์˜์—ญ์— ๋Œ€ํ•ด์„œ๋Š” ๋™๊ฒฐํ•˜์ง€ ๋ชปํ•œ๋‹ค(์ฐธ์กฐ๊ฐ’์—์„œ ์ผ๋ฐ˜์ ์ธ ๋ณต์‚ฌ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ์–•์€ ๋ณต์‚ฌ๋ฐ–์— ๋˜์ง€ ์•Š๋Š” ์›๋ฆฌ์™€ ๊ฐ™๋‹ค)
    • ๋”ฐ๋ผ์„œ 2 depth ์ด์ƒ์˜ ์ค‘์ฒฉ๋œ ์˜์—ญ์— ๋Œ€ํ•ด์„œ๋„ ๋™๊ฒฐํ•˜๋ ค๋ฉด, ์ค‘์ฒฉ๋œ freezing์„ ํ•ด์•ผ ํ•œ๋‹ค.

      • ์ค‘์ฒฉ๋œ freezing์€ ๋Œ€์ค‘์ ์ธ ์œ ํ‹ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(lodash)์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ง์ ‘ ์œ ํ‹ธ ํ•จ์ˆ˜ ์ƒ์„ฑํ•˜์—ฌ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.
    < ์ง์ ‘ ์œ ํ‹ธ ํ•จ์ˆ˜์˜ ๋กœ์ง์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. >
        - 1.๊ฐ์ฒด๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ,
            - 2.๊ฐ’์ด ๊ฐ์ฒด์ธ์ง€ ํ™•์ธํ•˜์—ฌ
                - 3.๊ฐ์ฒด์ด๋ฉด `์žฌ๊ท€`ํ•˜๊ณ 
                - 4.๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด Object.freeze()ํ•œ๋‹ค.

    Written by@Marco

    GitHub