๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
JS

[JavaScript] : ๋‹จ์ถ•์†์„ฑ๋ช…, ์ „๊ฐœ๊ตฌ๋ฌธ, ๋‚˜๋จธ์ง€ ๋งค๊ฐœ๋ณ€์ˆ˜, ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด.

by ๊ถŒ์Šพํ–„ 2023. 6. 9.

spread operator

๋‹จ์ถ•์†์„ฑ๋ช…
property shorthand
// ์˜ˆ์‹œ

const name = 'song'; // name ์ด๋ผ๋Š” ๋ณ€์ˆ˜์— 'song'์„ ํ• ๋‹นํ•˜๊ณ ;
const age = 28; // age ๋ผ๋Š” ๋ณ€์ˆ˜์—๋Š” 28์„ ํ• ๋‹นํ–ˆ์„ ๋•Œ,

const obj = {
    name:name // ์œ„์— ํ• ๋‹นํ•œ ๋ณ€์ˆ˜๋ฅผ value ์ž๋ฆฌ์— ๋„ฃ์–ด์คŒ.
    age:age // ์œ„์— ํ• ๋‹นํ•œ ๋ณ€์ˆ˜๋ฅผ value ์ž๋ฆฌ์— ๋„ฃ์–ด์คŒ.
};
 // ๋ผ๊ณ  obj์— ๊ฐ’์„ ํ• ๋‹นํ•˜๋ฉด,
 
 console.log(obj); // ์ฝ˜์†”๋กœ ์ฐ์—ˆ์„ ๋•Œ,
 
 //์ถœ๋ ฅ๊ฐ’
{ name: 'song', age: 28 } // ์ด์™€ ๊ฐ™์ด ์ถœ๋ ฅ์ด ๋œ๋‹ค.

์œ„๋Š” ๊ฐ์ฒด์˜ ์„ฑ์งˆ์—์„œ, key-value์˜ pair๋กœ ์ด๋ฃจ์–ด์ง„ ๊ฐ์ฒด์˜ value ์ž๋ฆฌ์—๋Š” ํ•จ์ˆ˜๋„ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๊ณ , ๋ณ€์ˆ˜๋„ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์กฐ๊ฑด์— ์ œํ•œ์ด ์—†๋‹ค.

์œ„ ๊ฐ์ฒด์˜ ์„ฑ์งˆ์„ ์ด์šฉํ•ด์„œ

name์˜ value ์ž๋ฆฌ์—๋Š” 'song' ์ด๋ผ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๊ณ ์žˆ๋Š” name์ด๋ผ๋Š” "๋ณ€์ˆ˜"๋ฅผ ๋„ฃ์–ด์ค€ ๊ฒƒ์ด๊ณ ,
age์˜ value ์ž๋ฆฌ์—๋Š” 28์ด๋ผ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๊ณ ์žˆ๋Š” age๋ผ๋Š” "๋ณ€์ˆ˜"๋ฅผ ๋„ฃ์–ด์ค€ ๊ฒƒ์ด๋‹ค.

์œ„์™€ ๊ฐ™์ด key ์™€ value์˜ ์ด๋ฆ„์ด ๊ฐ™์œผ๋ฉด, ์—ฌ๊ธฐ์„œ "๋‹จ์ถ•์†์„ฑ๋ช…"์„ ์‚ฌ์šฉํ•  ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

// ๋‹จ์ถ•์†์„ฑ๋ช… ์‚ฌ์šฉํ•œ ์ฝ”๋“œ

const name = 'song';
const age = 28;

const obj = { name, age }; // key์™€ value์˜ ์ด๋ฆ„์ด ๊ฐ™์œผ๋ฏ€๋กœ ๊ณผ๊ฐํžˆ ์ƒ๋žตํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.

console.log(name, age); // 'song', 28
console.log(obj); // {name :'song',age : 28}

์ „๊ฐœ๊ตฌ๋ฌธ
spread operator

(1). ๋ฐฐ์—ด์—์„œ์˜ ์ „๊ฐœ๊ตฌ๋ฌธ

์‚ฌ์šฉ๋ฐฉ๋ฒ• : ๋ฐฐ์—ด๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฐ์ดํ„ฐ์˜ ์ด๋ฆ„ ์•ž์— ... ์„ ์จ์ค€๋‹ค.

// ๋ฐฐ์—ด์˜ ์ „๊ฐœ๊ตฌ๋ฌธ
// ... = spread operator

let arr = [1, 2, 3]; // ๋ฐฐ์—ด์„ ํ•˜๋‚˜ ์„ ์–ธํ•ด์„œ ๊ฐ’์„ ํ• ๋‹นํ•˜๊ณ ,
console.log(arr); // ๊ทธ ๊ฐ’์„ ์ฝ˜์†”๋กœ ์ฐ๋Š”๋‹ค.
console.log(...arr); // ๊ทธ ๊ฐ’์„ ...์œผ๋กœ ์ „๊ฐœ๋ฅผ ์‹œ์ผœ์„œ, ์ฝ˜์†”๋กœ ์ฐ๋Š”๋‹ค.

// ์ถœ๋ ฅ๊ฐ’
[ 1, 2, 3 ]
1 2 3

์ „๊ฐœ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐฐ์—ด์— ์–ด๋– ํ•œ ๊ฐ’์„ push ํ•˜์ง€ ์•Š๊ณ , ์•„๋ž˜์™€ ๊ฐ™์ด ๊ฐ’์„ ์ถ”๊ฐ€ ํ•ด ์ค„ ์ˆ˜ ์žˆ๋‹ค.

let newArr = [...arr, 4]; // spread operator๋ฅผ ์‚ฌ์šฉํ•ด arr์˜ ์š”์†Œ๊ฐ’์„ ๋ฐฐ์—ด์„ ๋ฒ—๊ฒจ์ฃผ๊ณ , 4๋ผ๋Š” ์š”์†Œ๋ฅผ ๋ฐฐ์—ด์•ˆ์— ์ถ”๊ฐ€ํ•ด ์ƒˆ๋กœ์šด ๋ฐฐ์—ด newArr์— ํ• ๋‹นํ–ˆ๋‹ค.
console.log(newArr); // ์ฝ˜์†”๋กœ ํ™•์ธํ•ด๋ณด๋ฉด

// ์ถœ๋ ฅ๊ฐ’
[ 1, 2, 3, 4 ] // ๋ฐฐ์—ดํ•˜๋‚˜์— ์ž˜ ๋“ค์–ด๊ฐ€์žˆ๋Š”๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

(2). ๊ฐ์ฒด์—์„œ์˜ ์ „๊ฐœ๊ตฌ๋ฌธ

// ๊ฐ์ฒด์—์„œ์˜ ์ „๊ฐœ๊ตฌ๋ฌธ

let user = {
    name: 'song',
    age: 28,
}; // user๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค๊ณ ,

let user2 = { ...user }; // user2๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•ด์„œ ๊ทธ ๊ฐ’์„ {}์•ˆ์— user๋ฅผ ์ „๊ฐœ์‹œ์ผœ์ฃผ๊ณ  ์ฝ˜์†”๋กœ ํ™•์ธํ•ด๋ณด๋ฉด

console.log(user);
console.log(user2);

// ์ถœ๋ ฅ๊ฐ’
{ name: 'song', age: 28 } // = user
{ name: 'song', age: 28 } // = user2

์œ„์™€๊ฐ™์ด ์ƒˆ๋กญ๊ฒŒ ๊ฐ’์„ ํ• ๋‹นํ•˜๊ณ , ์ƒˆ๋กœ์šด ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , ๋ฌด๊ถ๋ฌด๊ตฌ์ง„ํ•œ ๋ฐฉ๋ฉด์œผ๋กœ ์ „๊ฐœ๊ตฌ๋ฌธ์€ ํ™œ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.


๋‚˜๋จธ์ง€ ๋งค๊ฐœ๋ณ€์ˆ˜
rest parameter
// rest parameter

function example(a, b, c, ...args) {
    console.log(a, b, c);
    console.log(...args);
    console.log(args);
}
example(1, 2, 3);
example(1, 2, 3, 4, 5, 6, 7);

// ์ถœ๋ ฅ๊ฐ’
// example(1, 2, 3)์˜ ์ถœ๋ ฅ๊ฐ’
1 2 3     // console.log(a, b, c)
          // console.log(...args)
[]        // console.log(args)
// example(1, 2, 3, 4, 5, 6, 7)์˜ ์ถœ๋ ฅ๊ฐ’
1 2 3     // console.log(a, b, c)
4 5 6 7   // console.log(...args)
[ 4, 5, 6, 7 ] // console.log(args)

์œ„์—์„œ example์ด๋ผ๋Š” ํ•จ์ˆ˜์— ๊ฐ’์„ ๋„ฃ์–ด ์‹คํ–‰์‹œํ‚จ ์ถœ๋ ฅ๊ฐ’์œผ๋กœ๋ถ€ํ„ฐ ์•Œ ์ˆ˜ ์žˆ๋Š” ๋‚ด์šฉ๋“ค์ด ์žˆ๋‹ค.

  • a,b,c ์— ๋งค์นญ๋˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ˆ˜๊ฐ€ ๊ทธ ์ด์ƒ์œผ๋กœ ๋„˜์–ด๊ฐ€๋ฉด, ...args๊ฐ€ ๊ทธ ๋งค๊ฐœ๋ณ€์ˆ˜๋“ค์„ ๋Œ€์‹ ํ•˜์—ฌ ๋ฐ›์•„์ฃผ๊ณ , ๊ฒฐ๊ณผ๊ฐ’์„ ์ •์ƒ์ ์œผ๋กœ ์ถœ๋ ฅํ•ด์ค€๋‹ค.
  • args๋ฅผ spread operator๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€์ฑ„ ์ฝ˜์†”๋กœ ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋ฉด, "๋ฐฐ์—ด"์˜ ํ˜•ํƒœ๋ฅผ ์ง€๋‹ˆ๊ณ , args์— ๋“ค์–ด์˜จ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐ’๋“ค์€ "๋ฐฐ์—ด"์˜ "์š”์†Œ"๋กœ ์ €์žฅ๋œ๋‹ค.
  • console.log(...args)๋ฅผ ์ถœ๋ ฅํ–ˆ์„ ๋•Œ, ๋“ค์–ด์˜ค๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์œผ๋ฉด, undefined๊ฐ€ ์•„๋‹Œ, ๊ณต๋ž€์ด ์ถœ๋ ฅ๋œ๋‹ค. args๊ฐ€ ๋นˆ ๋ฐฐ์—ด์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฑธ๋กœ ๋ณด์•˜์„ ๋•Œ, ๋ฐฐ์—ด์˜ ์š”์†Œ๊ฐ’์ด undefined๋Š” ์•„๋‹Œ๋ชจ์–‘์ด๋‹ค.

ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด
Template Literal
``
console.log(`hello world ${3 + 3}`); // ${} ๊ด„ํ˜ธ ์•ˆ์—๋Š” javascript์˜ ๊ฑฐ์˜ ๋ชจ๋“  ๋ฌธ๋ฒ•์ด ๋“ค์–ด์˜ฌ ์ˆ˜ ์žˆ๋Š”๊ฒƒ ๊ฐ™๋‹ค.
const all = 'vincenjo';     // all ์ด๋ผ๋Š” ๋ณ€์ˆ˜์— ๋นˆ์„ผ์กฐ๋ผ๋Š” ๊ฐ’์„ ํ• ๋‹นํ•˜๊ณ ,
console.log(`hello ${all}`); // ${}๊ด„ํ˜ธ์•ˆ์— ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋„ฃ์–ด์ค€๋‹ค.
console.log(`                // ``๋นฝํ‹ฑ์€ ๊ต‰์žฅํžˆ ์œ ์šฉํ•œ ๋ฉ€ํ‹ฐ๋ผ์ธ์„ ์ง€์›ํ•ด์ค€๋‹ค.
    ์ด ์„ธ์ƒ ์œ„์—” ๋‚ด๊ฐ€์žˆ๊ณ ,
          ๋‚˜๋ฅผ ์‚ฌ๋ž‘ํ•ด์ฃผ๋Š”
            ๋‚˜์˜ ์‚ฌ๋žŒ๋“ค๊ณผ ~
        ๋‚˜์˜ ๊ธธ์„๊ฐ€๊ณ ์‹ถ์–ด ~~.
    ๋‚˜๋Š” ๋ฌธ์ œ ์—†์–ด -ํ™ฉ๊ทœ์˜-
`);

// ์ถœ๋ ฅ๊ฐ’

hello world 6
hello vincenjo

    ์ด ์„ธ์ƒ ์œ„์—” ๋‚ด๊ฐ€์žˆ๊ณ ,
          ๋‚˜๋ฅผ ์‚ฌ๋ž‘ํ•ด์ฃผ๋Š”
            ๋‚˜์˜ ์‚ฌ๋žŒ๋“ค๊ณผ ~
        ๋‚˜์˜ ๊ธธ์„๊ฐ€๊ณ ์‹ถ์–ด ~~.
    ๋‚˜๋Š” ๋ฌธ์ œ ์—†์–ด -ํ™ฉ๊ทœ์˜-

ES6๋ฌธ๋ฒ• ์ค‘ 4๊ฐœ๋ฅผ ์ •๋ฆฌํ•ด๋ณด์•˜๋‹ค.

์œ„ 4๊ฐœ์˜ ๋ฌธ๋ฒ•๋“ค์€ javascript์— ๊ฐ“ ์ž…๋ฌธํ•œ ๋‚˜์กฐ์ฐจ๋„ ๊ต‰์žฅํžˆ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ๋ฒ•๋“ค์ด๋‹ค.

ํŠนํžˆ ๋นฝํ‹ฑ์€ ๋Œ“๊ธ€๊ธฐ๋Šฅ ๊ด€๋ จํ•ด์„œ ํ”„๋ก ํŠธ์— ์ž‘์„ฑ๋œ ๋Œ“๊ธ€๋“ค์„ ๋ณด์—ฌ์ฃผ๋Š” ์šฉ๋„๋กœ ๊ต‰์žฅํžˆ ์œ ์šฉํ•˜๊ฒŒ ์ƒ์šฉํ–ˆ๋‹ค.

  const comment = document.querySelector("#comment");
  comment.innerHTML = data
    .map((review, index) => {
      // review๋Š” ๋ฆฌ๋ทฐ๊ฐ์ฒด, index๋Š” data์—์„œ์˜ ์ธ๋ฑ์Šค
      let { writer, contents } = review; // ๊ตฌ์กฐ๋ถ„ํ•ดํ• ๋‹น : ๋ฆฌ๋ทฐ์˜ writer, contents ์†์„ฑ์˜ ๊ฐ’์„ ๋ณ€์ˆ˜์— ํ• ๋‹น
      if (!writer) writer = "์ด๋ฆ„์ด ์—†์Šต๋‹ˆ๋‹ค.";
      if (!contents) contents = "๋‚ด์šฉ์ด ์—†์Šต๋‹ˆ๋‹ค."; // validation check
      return `<li class="review" data-number="${index}">
                  <p class="comment-contents">${contents}</p>
                  <p class="comment-writer">์ž‘์„ฑ์ž: ${writer}</p>
                  <div>
                    <button class="update">์ˆ˜์ •</button>       
                    <button class="delete">์‚ญ์ œ</button>      
                  <div>
                </li>`

์œ„์˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด ``๋นฝํ‹ฑ์•ˆ์— ํŠน์ • html์„ ๊ฐ€์ ธ์™€ ๋‹ด์•„์ฃผ๊ณ  ${} ๊ด„ํ˜ธ์•ˆ์—๋Š” ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋„ฃ์–ด์ฃผ์–ด์„œ, ๊ตฌํ˜„์‹œํ‚ค๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๊ทธ๋ž˜์„œ ์˜ค๋Š˜์€ ES6์˜ ์ด 4๊ฐ€์ง€๋ฌธ๋ฒ•์„ ํ•œ ๋ฒˆ ์ •๋ฆฌํ•ด ๋‘๊ณ  ์‹ถ์—ˆ๋‹ค.

args์˜ ๊ฐ’์ด spread operator๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€์ฑ„ ์ถœ๋ ฅํ•˜๋ฉด, ๋ฐฐ์—ด์˜ ๊ฐ’์œผ๋กœ ๋ฐ›๋Š”๋‹ค๋Š” ๊ฒƒ๋„ ์ฒ˜์Œ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

๊ด€๋ จํ•ด์„œ ๋ช‡ ๊ฐ€์ง€ ์‚ฝ์งˆ์„ ํ•ด๋ณด์•„์•ผ ๊ฒ ๋‹ค.

#์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ #ES6๋ฌธ๋ฒ• #property_shorthand #spread_operator #rest_parameter #args #array #template_literal #๋นฝํ‹ฑ

#๋‹จ์ถ•์†์„ฑ๋ช…์€_key์™€_value์˜_๋ช…์ด๊ฐ™์œผ๋ฉด_๊ทธ๋•Œ_์‚ฌ์šฉ์ด_๊ฐ€๋Šฅํ•˜๋‹ค