ํฐ์คํ ๋ฆฌ ๋ทฐ
[JavaScript] ์คํ๋ ๋ ๋ฌธ๋ฒ
๊ฐ๋ฐ๊ฐ๊ตด๐ธ 2022. 8. 5. 18:45ES6์์ ๋์ ๋ ์คํ๋ ๋ ๋ฌธ๋ฒ(spread syntax, ์ ๊ฐ ๋ฌธ๋ฒ) ... ์ ํ๋๋ก ๋ญ์ณ ์๋ ์ฌ๋ฌ ๊ฐ๋ค์ ์งํฉ์ ํผ์ณ์ ๊ฐ๋ณ์ ์ธ ๊ฐ๋ค์ ๋ชฉ๋ก์ผ๋ก ๋ง๋ญ๋๋ค.
์คํ๋ ๋ ๋ฌธ๋ฒ์ ์ฌ์ฉํ ์ ์๋ ๋์์ Array, String, Map, Set, DOM ์ปฌ๋ ์ (NodeList, HTMLCollection), arguments์ ๊ฐ์ด for ... of ๋ฌธ์ผ๋ก ์ํํ ์ ์๋ ์ดํฐ๋ฌ๋ธ์ ํ์ ๋ฉ๋๋ค.
// ...[1, 2, 3]์ [1, 2, 3]์ ๊ฐ๋ณ ์์๋ก ๋ถ๋ฆฌํ๋ค(→ 1, 2, 3)
console.log(...[1, 2, 3]); // 1 2 3
// ๋ฌธ์์ด์ ์ดํฐ๋ฌ๋ธ์ด๋ค.
console.log(...'Hello'); // H e l l o
// Map๊ณผ Set์ ์ดํฐ๋ฌ๋ธ์ด๋ค.
console.log(...new Map([['a', '1'], ['b', '2']])); // [ 'a', '1' ] [ 'b', '2' ]
console.log(...new Set([1, 2, 3])); // 1 2 3
// ์ดํฐ๋ฌ๋ธ์ด ์๋ ์ผ๋ฐ ๊ฐ์ฒด๋ ์คํ๋ ๋ ๋ฌธ๋ฒ์ ๋์์ด ๋ ์ ์๋ค.
console.log(...{ a: 1, b: 2 });
// TypeError: Found non-callable @@iterator
์ ์์ ์ ๊ฐ์ด ... [1, 2, 3]์ ๊ฐ๋ค์ ๋ชฉ๋ก 1, 2, 3์ ๋ง๋ญ๋๋ค. ๋ฐ๋ผ์ ์คํ๋ ๋ ๋ฌธ๋ฒ ... ์ด ํผ์ฐ์ฐ์๋ฅผ ์ฐ์ฐํ์ฌ ๊ฐ์ ์์ฑํ๋ ์ฐ์ฐ์๊ฐ ์๋๋ผ ์คํ๋ ๋ ๋ฌธ๋ฒ์ ๊ฒฐ๊ณผ๋ ๊ฐ์ด ์๋๋ฏ๋ก ๋ณ์์ ํ ๋น์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค.
// ์คํ๋ ๋ ๋ฌธ๋ฒ์ ๊ฒฐ๊ณผ๋ ๊ฐ์ด ์๋๋ค.
const list = ...[1, 2, 3]; // SyntaxError: Unexpected token ...
์ด์ฒ๋ผ ์คํ๋ ๋ ๋ฌธ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ด ์ผํ๋ก ๊ตฌ๋ถํ ๊ฐ์ ๋ชฉ๋ก์ ์ฌ์ฉํ๋ ๋ฌธ๋งฅ์์๋ง ์ฌ์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค.
- ํจ์ ํธ์ถ๋ฌธ์ ์ธ์ ๋ชฉ๋ก
- ๋ฐฐ์ด ๋ฆฌํฐ๋ด์ ์์ ๋ชฉ๋ก
- ๊ฐ์ฒด ๋ฆฌํฐ๋ด์ ํ๋กํผํฐ ๋ชฉ๋ก
ํจ์ ํธ์ถ๋ฌธ์ ์ธ์ ๋ชฉ๋ก์์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
์์๋ค์ ์งํฉ์ธ ๋ฐฐ์ด์ ํผ์ณ์ ๊ฐ๋ณ์ ์ธ ๊ฐ๋ค์ ๋ชฉ๋ก์ผ๋ก ๋ง๋ ํ, ์ด๋ฅผ ํจ์์ ์ธ์ ๋ชฉ๋ก์ผ๋ก ์ ๋ฌํด์ผ ํ๋ ๊ฒฝ์ฐ์ ์คํ๋ ๋ ๋ฌธ๋ฒ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Math.max([1, 2, 3]); // -> NaN
var arr = [1, 2, 3];
// apply ํจ์์ 2๋ฒ์งธ ์ธ์(๋ฐฐ์ด)๋ apply ํจ์๊ฐ ํธ์ถํ๋ ํจ์์ ์ธ์ ๋ชฉ๋ก์ด๋ค.
// ๋ฐ๋ผ์ ๋ฐฐ์ด์ด ํผ์ณ์ ธ์ ์ธ์๋ก ์ ๋ฌ๋๋ ํจ๊ณผ๊ฐ ์๋ค.
var max = Math.max.apply(null, arr); // -> 3
// ์คํ๋ ๋ ๋ฌธ๋ฒ์ ์ฌ์ฉํ์ฌ ๋ฐฐ์ด arr์ 1, 2, 3์ผ๋ก ํผ์ณ์ Math.max์ ์ ๋ฌํ๋ค.
// Math.max(...[1, 2, 3])์ Math.max(1, 2, 3)๊ณผ ๊ฐ๋ค.
const max = Math.max(...arr); // -> 3
์ด์ฒ๋ผ ์คํ๋ ๋ ๋ฌธ๋ฒ์ ์ฌ์ฉํ๋ฉด ๊ฐ๊ฒฐํ๊ณ ๊ฐ๋ ์ฑ์ด ์ข๊ฒ ์์๋ค์ ๋ชฉ๋ก์ ํจ์์ ์ธ์๋ก ์ ๋ฌํ ์ ์์ต๋๋ค.
*์คํ๋ ๋ ๋ฌธ๋ฒ์ Rest ํ๋ผ๋ฏธํฐ์ ํํ๊ฐ ๋์ผํ์ฌ ํผ๋ํ ์ ์์ผ๋ฏ๋ก ์ฃผ์ํ ํ์๊ฐ ์์. Rest ํ๋ผ๋ฏธํฐ๋ ์คํ๋ ๋ ๋ฌธ๋ฒ๊ณผ ๋ฐ๋์ ๊ฐ๋ ์ผ๋ก ์ธ์๋ค์ ๋ชฉ๋ก์ ๋ฐฐ์ด๋ก ์ ๋ฌ๋ฐ๊ธฐ ์ํด ๋งค๊ฐ๋ณ์ ์ด๋ฆ ์์ ... ์ ๋ถ์ด๋ ๊ฒ
๋ฐฐ์ด ๋ฆฌํฐ๋ด ๋ด๋ถ์์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
์คํ๋ ๋ ๋ฌธ๋ฒ์ ๋ฐฐ์ด ๋ฆฌํฐ๋ด์์ ์ฌ์ฉํ๋ฉด ES5์์ ์ฌ์ฉํ๋ ๊ธฐ์กด์ ๋ฐฉ์๋ณด๋ค ๋์ฑ ๊ฐ๊ฒฐํ๊ณ ๊ฐ๋ ์ฑ ์ข๊ฒ ํํํ ์ ์์ต๋๋ค.
concat
์คํ๋ ๋ ๋ฌธ๋ฒ์ ์ฌ์ฉํ๋ฉด concat๊ณผ ๊ฐ์ ๋ณ๋์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋ฐฐ์ด ๋ฆฌํฐ๋ด๋ง์ผ๋ก 2๊ฐ์ ๋ฐฐ์ด์ 1๊ฐ์ ๋ฐฐ์ด๋ก ๊ฒฐํฉํ ์ ์์ต๋๋ค.
// ES5
var arr = [1, 2].concat([3, 4]);
console.log(arr); // [1, 2, 3, 4]
// ES6
const arr = [...[1, 2], ...[3, 4]];
console.log(arr); // [1, 2, 3, 4]
splice
์คํ๋ ๋ ๋ฌธ๋ฒ์ ์ฌ์ฉํ๋ฉด ๋ฐฐ์ด์ ์ค๊ฐ์ ๋ค๋ฅธ ๋ฐฐ์ด์ ์์๋ค์ ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐํ ๋ splice ๋ฉ์๋๋ฅผ ๋์ฑ ๊ฐ๊ฒฐํ๊ณ ๊ฐ๋ ์ฑ ์ข๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
// ES5
var arr1 = [1, 4];
var arr2 = [2, 3];
/*
apply ๋ฉ์๋์ 2๋ฒ์งธ ์ธ์(๋ฐฐ์ด)๋ apply ๋ฉ์๋๊ฐ ํธ์ถํ splice ๋ฉ์๋์ ์ธ์ ๋ชฉ๋ก์ด๋ค.
apply ๋ฉ์๋์ 2๋ฒ์งธ ์ธ์ [1, 0].concat(arr2)๋ [1, 0, 2, 3]์ผ๋ก ํ๊ฐ๋๋ค.
๋ฐ๋ผ์ splice ๋ฉ์๋์ apply ๋ฉ์๋์ 2๋ฒ์งธ ์ธ์ [1, 0, 2, 3]์ด ํด์ฒด๋์ด ์ ๋ฌ๋๋ค.
์ฆ, arr1[1]๋ถํฐ 0๊ฐ์ ์์๋ฅผ ์ ๊ฑฐํ๊ณ ๊ทธ ์๋ฆฌ(arr1[1])์ ์๋ก์ด ์์(2, 3)๋ฅผ ์ฝ์
ํ๋ค.
*/
Array.prototype.splice.apply(arr1, [1, 0].concat(arr2));
console.log(arr1); // [1, 2, 3, 4]
// ES6
const arr1 = [1, 4];
const arr2 = [2, 3];
arr1.splice(1, 0, ...arr2);
console.log(arr1); // [1, 2, 3, 4]
๋ฐฐ์ด ๋ณต์ฌ
์คํ๋ ๋ ๋ฌธ๋ฒ์ ์ฌ์ฉํ๋ฉด ๋ฐฐ์ด์ ๋ณต์ฌํ ๋ slice ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๊ฐ๊ฒฐํ๊ณ ๊ฐ๋ ์ฑ ์ข๊ฒ ํํํ ์ ์์ต๋๋ค.
// ES5
var origin = [1, 2];
var copy = origin.slice();
console.log(copy); // [1, 2]
console.log(copy === origin); // false
// ES6
const origin = [1, 2];
const copy = [...origin];
console.log(copy); // [1, 2]
console.log(copy === origin); // false
์ดํฐ๋ฌ๋ธ์ ๋ฐฐ์ด๋ก ๋ณํ
arguments ๊ฐ์ฒด๋ ์ดํฐ๋ฌ๋ธ์ด๋ฉด์ ์ ์ฌ ๋ฐฐ์ด ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ ์คํ๋ ๋ ๋ฌธ๋ฒ์ ์ฌ์ฉํ๋ฉด ๊ฐํธํ๊ฒ ์ดํฐ๋ฌ๋ธ์ ๋ฐฐ์ด๋ก ๋ณํํ ์ ์์ต๋๋ค. ํ์ง๋ง, Rest ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ๋๋ค.
// ES5
function sum() {
// ์ดํฐ๋ฌ๋ธ์ด๋ฉด์ ์ ์ฌ ๋ฐฐ์ด ๊ฐ์ฒด์ธ arguments๋ฅผ ๋ฐฐ์ด๋ก ๋ณํ
var args = Array.prototype.slice.call(arguments);
return args.reduce(function (pre, cur) {
return pre + cur;
}, 0);
}
console.log(sum(1, 2, 3)); // 6
// ์ดํฐ๋ฌ๋ธ์ด ์๋ ์ ์ฌ ๋ฐฐ์ด ๊ฐ์ฒด
const arrayLike = {
0: 1,
1: 2,
2: 3,
length: 3
};
const arr = Array.prototype.slice.call(arrayLike); // -> [1, 2, 3]
console.log(Array.isArray(arr)); // true
// ES6
function sum() {
// ์ดํฐ๋ฌ๋ธ์ด๋ฉด์ ์ ์ฌ ๋ฐฐ์ด ๊ฐ์ฒด์ธ arguments๋ฅผ ๋ฐฐ์ด๋ก ๋ณํ
return [...arguments].reduce((pre, cur) => pre + cur, 0);
}
console.log(sum(1, 2, 3)); // 6
// Rest ํ๋ผ๋ฏธํฐ args๋ ํจ์์ ์ ๋ฌ๋ ์ธ์๋ค์ ๋ชฉ๋ก์ ๋ฐฐ์ด๋ก ์ ๋ฌ๋ฐ๋๋ค.
const sum = (...args) => args.reduce((pre, cur) => pre + cur, 0);
console.log(sum(1, 2, 3)); // 6
๊ฐ์ฒด ๋ฆฌํฐ๋ด ๋ด๋ถ์์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
Rest ํ๋กํผํฐ์ ํจ๊ป TC39 ํ๋ก์ธ์ค์ stage 4 ๋จ๊ณ์ ์ ์๋์ด ์๋ ์คํ๋ ๋ ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ์ฒด ๋ฆฌํฐ๋ด์ ํ๋กํผํฐ ๋ชฉ๋ก์์๋ ์คํ๋ ๋ ๋ฌธ๋ฒ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
// ์คํ๋ ๋ ํ๋กํผํฐ
// ๊ฐ์ฒด ๋ณต์ฌ(์์ ๋ณต์ฌ)
const obj = { x: 1, y: 2 };
const copy = { ...obj };
console.log(copy); // { x: 1, y: 2 }
console.log(obj === copy); // false
// ๊ฐ์ฒด ๋ณํฉ
const merged = { x: 1, y: 2, ...{ a: 3, b: 4 } };
console.log(merged); // { x: 1, y: 2, a: 3, b: 4 }
[์ถ์ฒ] ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ Deep Dive
'JavaScript > ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ Deep Dive' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JavaScript] Set๊ณผ Map (0) | 2022.08.07 |
---|---|
[JavaScript] ๋์คํธ๋ญ์ฒ๋ง ํ ๋น (0) | 2022.08.06 |
[JavaScript] ์ดํฐ๋ฌ๋ธ (0) | 2022.08.05 |
[JavaScript] 7๋ฒ์งธ ๋ฐ์ดํฐ ํ์ Symbol (0) | 2022.08.05 |
[JavaScript] String (0) | 2022.08.03 |
- Total
- Today
- Yesterday
- ๋ ์์ปฌ ํ๊ฒฝ
- ์ ์ญ ๋ณ์
- ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ
- ์๋ฐ์คํฌ๋ฆฝํธ
- JavaScript
- ์ฝ๋ฉํ ์คํธ
- TDD
- ์ด์์ฒด์
- ๋์์ธ ํจํด
- ์นด์นด์ค ์ธํด
- ์๊ณ ๋ฆฌ์ฆ
- Baekjoon
- fp
- ์ด๋ถํ์
- ๋ฐฑ์ค node.js
- ํ๋ก๊ทธ๋๋จธ์ค
- ๋ฐฑ์ค
- ํ๋กํผํฐ
- ํจ์ํ ํ๋ก๊ทธ๋๋ฐ
- ๋คํธ์ํฌ
- ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ
- ํ๋กํ ์ฝ
- ์๋ฐ
- ํฌํฌ์ธํฐ
- ๋ฐฑ์ค javascript
- 2019 ์นด์นด์ค ๊ฐ๋ฐ์ ๊ฒจ์ธ ์ธํด
- http
- git
- ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ deep dive
- map
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |