์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ฐฐ์ด์ ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ ์์ฐจ์ ์ผ๋ก ๋์ดํ ์๋ฃ๊ตฌ์กฐ๋ก ์๋ฐํ ๋ง์ ์๋ฃ๊ตฌ์กฐ์์ ํต์ฉ๋๋ ์ผ๋ฐ์ ์ธ ์๋ฏธ์ ๋ฐฐ์ด์ด ์๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ฐฐ์ด์ ์ผ๋ฐ์ ์ธ ๋ฐฐ์ด์ ๋์์ ํ๋ด ๋ธ ํน์ํ ๊ฐ์ฒด
๋ค.
์๋ฃ๊ตฌ์กฐ์์ ๋งํ๋ ๋ฐฐ์ด
์ ๋์ผํ ํฌ๊ธฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ๋นํ์์ด ์ฐ์์ ์ผ๋ก ๋์ด๋ ์๋ฃ๊ตฌ์กฐ๋ฅผ ๋งํ๋ค. ์ฆ, ๋ฐฐ์ด์ ์์๋ ํ๋์ ๋ฐ์ดํฐ ํ์
์ผ๋ก ํต์ผ๋์ด ์์ผ๋ฉฐ ์๋ก ์ฐ์์ ์ผ๋ก ์ธ์
ํด ์๋ค. ์ด๋ฌํ ๋ฐฐ์ด์ ๋ฐ์ง ๋ฐฐ์ด(dense array)
์ด๋ผ ํ๋ค.
ํ์ง๋ง ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ฐฐ์ด์ ์๋ฃ๊ตฌ์กฐ์์ ๋งํ๋ ์ผ๋ฐ์ ์ธ ๋ฐฐ์ด์ ์๋ฏธ์ ๋ค๋ฅด๋ค.
์ฆ, ๋ฐฐ์ด์ ์์๋ฅผ ์ํ ๊ฐ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋์ผํ ํฌ๊ธฐ๋ฅผ ๊ฐ์ง ์์๋ ๋๋ฉฐ, ์ฐ์์ ์ผ๋ก ์ด์ด์ ธ ์์ง ์์ ์๋ ์๋ค.
๋ฐฐ์ด์ ์์๊ฐ ์ฐ์์ ์ผ๋ก ์ด์ด์ ธ ์์ง ์๋ ๋ฐฐ์ด์ ํฌ์ ๋ฐฐ์ด(sparse array)
๋ผ๊ณ ํ๋ค.
์ผ๋ฐ์ ์ธ ๋ฐฐ์ด์ ๊ฐ ์์๊ฐ ๋์ผํ ๋ฐ์ดํฐ ํฌ๊ธฐ๋ฅผ ๊ฐ์ง๋ฉฐ ๋นํ์์ด ์ฐ์์ ์ผ๋ก ์ด์ด์ ธ ์์ผ๋ฏ๋ก ์ธ๋ฑ์ค๋ฅผ ํตํด ๋จ ํ๋ฒ์ ์ฐ์ฐ์ผ๋ก ์์์ ์์์ ์ ๊ทผํ ์ ์์ด ๋งค์ฐ ํจ์จ์ ์ด๋ค. ํ์ง๋ง ํน์ ์์๋ฅผ ๊ฒ์ํ๊ฑฐ๋ ์์๋ฅผ ์ฝ์ ๋๋ ์ญ์ ํ๋ ๊ฒฝ์ฐ์๋ ๋ฐฐ์ด์ ์์๋ฅผ ์ฐ์์ ์ผ๋ก ์ ์งํ๊ธฐ ์ํด ๊ฐ ์์๋ค์ ์ด๋์์ผ์ผํด์ ํจ์จ์ ์ด์ง ์๋ค. (์ ๋ ฌ๋์ด ์์ง ์์ ๊ฐ์ ์ ํ ํ์ํ ๊ฒฝ์ฐ, O(n)๋งํผ์ ์๊ฐ๋ณต์ก๋๊ฐ ๊ฑธ๋ฆฐ๋ค.)
์๋ฐ์คํฌ๋ฆฝํธ ๋ฐฐ์ด
์ ํด์ ํ
์ด๋ธ๋ก ๊ตฌํ๋ ๊ฐ์ฒด์ด๋ฏ๋ก ์ธ๋ฑ์ค๋ก ์์์ ์ ๊ทผํ๋ ๊ฒฝ์ฐ ์ผ๋ฐ์ ์ธ ๋ฐฐ์ด๋ณด๋ค ์ฑ๋ฅ์ ์ธ ๋ฉด์์ ๋๋ฆด์ ๋ฐ์ ์๋ ๊ตฌ์กฐ์ ์ธ ๋จ์
์ด ์๋ค. ํ์ง๋ง ํน์ ์์๋ฅผ ๊ฒ์ํ๊ฑฐ๋ ์์๋ฅผ ์ฝ์
๋๋ ์ญ์ ํ๋ ๊ฒฝ์ฐ์๋ ์ผ๋ฐ์ ์ธ ๋ฐฐ์ด๋ณด๋ค ๋น ๋ฅธ ์ฑ๋ฅ์ ๊ธฐ๋
ํ ์ ์๋ค.
console.log(Object.getOwnPropertyDescriptors([1,2,3]));
/*
1. ์ธ๋ฑ์ค๋ฅผ ๋ํ๋ด๋ ๋ฌธ์์ด์ ํ๋กํผํฐ ํค๋ก ๊ฐ๋๋ค.
2. length ํ๋กํผํฐ๋ฅผ ๊ฐ๋ ํน์ํ ๊ฐ์ฒด๋ค.
3. ๋ฐฐ์ด์ ์์๋ ์ฌ์ค ํ๋กํผํฐ ๊ฐ์ด๋ค.
4. ์๋ฐ์คํฌ๋ฆฝํธ์์ ์ฌ์ฉํ ์ ์๋ ๋ชจ๋ ๊ฐ์ ๊ฐ์ฒด์ ํ๋กํผํฐ ๊ฐ์ด ๋ ์ ์๋ค.
์ฆ, ์ด๋ค ๊ฐ์ด๋ผ๋ ๋ฐฐ์ด์ ์์๊ฐ ๋ ์ ์๋ค.
{
'0': {
value: 1,
writable: true,
enumerable: true,
configurable: true
},
'1': {
value: 2,
writable: true,
enumerable: true,
configurable: true
},
'2': {
value: 3,
writable: true,
enumerable: true,
configurable: true
},
length: {
value: 3,
writable: true,
enumerable: false,
configurable: false
}
}
*/
length ํ๋กํผํฐ๋ ์์์ ๊ฐ์, ์ฆ ๋ฐฐ์ด์ ๊ธธ์ด๋ฅผ ๋ํ๋ด๋ 0 ์ด์์ ์ ์๋ฅผ ๊ฐ์ผ๋ก ๊ฐ๋๋ค. length ํ๋กํผํฐ ๊ฐ์ ์์์ ๊ฐ์, ์ฆ ๋ฐฐ์ด์ ๊ธธ์ด๋ฅผ ๋ฐํ์ผ๋ก ๊ฒฐ์ ๋์ง๋ง ์์์ ์ซ์ ๊ฐ์ ๋ช ์์ ์ผ๋ก ํ ๋นํ ์๋ ์๋ค.
const arr = [1, 2, 3, 4, 5];
arr.length = 3;
console.log(arr); // [1, 2, 3]
/*
1. <2 empty items>๋ ์ค์ ๋ก ์ถ๊ฐ๋ ๋ฐฐ์ด์ ์์๊ฐ ์๋๋ค. ๊ฐ์ด ์กด์ฌํ์ง ์๋๋ค.
2. length ํ๋กํผํฐ๋ ์ฑ๊ณต์ ์ผ๋ก ๋ณ๊ฒฝ๋์ง๋ง ์ค์ ๋ฐฐ์ด์๋ ์๋ฌด๋ฐ ๋ณํจ์ด ์๋ค.
๋น์ด ์๋ ์์๋ฅผ ์ํด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ๋ณดํ์ง ์์ผ๋ฉด ๋น ์์๋ฅผ ์์ฑํ์ง๋ ์๋๋ค.
*/
const arr = [1];
arr.length = 3;
console.log(arr.length); // 3
console.log(arr); // [1, <2 empty items>]
ํฌ์ ๋ฐฐ์ด์ length์ ๋ฐฐ์ด์ ์์์ ๊ฐ์๊ฐ ์ผ์นํ์ง ์๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ฌธ๋ฒ์ ์ผ๋ก ํฌ์ ๋ฐฐ์ด์ ํ์ฉํ์ง๋ง ํฌ์ ๋ฐฐ์ด์ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ์ข๋ค. ํฌ์ ๋ฐฐ์ด์ ์ฐ์์ ์ธ ๊ฐ์ ์งํฉ์ด๋ผ๋ ๋ฐฐ์ด์ ๊ธฐ๋ณธ์ ์ธ ๊ฐ๋
๊ณผ ๋ง์ง ์์ผ๋ฉฐ, ์ฑ๋ฅ์๋ ์ข์ง ์์ ์ํฅ์ ์ค๋ค. ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์์์ ํ์
์ด ์ผ์นํ๋ ๋ฐฐ์ด์ ์์ฑํ ๋ ์ผ๋ฐ์ ์ธ ์๋ฏธ์ ๋ฐฐ์ด์ฒ๋ผ ์ฐ์์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ๋ณดํ๋ ๊ฒ์ผ๋ก ์๋ ค์ ธ ์๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๋ฐฐ์ด์๋ ๊ฐ์ ํ์
์ ์์๋ฅผ ์ฐ์์ ์ผ๋ก ์์น์ํค๋ ๊ฒ์ด ์ต์
์ด๋ค.
๋ฐฐ์ด ๋ฆฌํฐ๋ด
: ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๋ฐฉ์์ผ๋ก 0๊ฐ ์ด์์ ์์๋ฅผ ์ผํ๋ก ๊ตฌ๋ถํ์ฌ ๋๊ดํธ๋ก ๋ฌถ๋๋ค.
Array ์์ฑ์ ํจ์
: new ์ฐ์ฐ์์ ํจ๊ป ํธ์ถํ์ง ์๋๋ผ๋ ๋ฐฐ์ด์ ์์ฑํ๋ค. ์ ๋ฌ๋ ์ธ์๊ฐ 2๊ฐ ์ด์์ด๋ฉด ์ธ์๋ฅผ ์์๋ก ๊ฐ๋ ๋ฐฐ์ด์ ์์ฑํ๋ฉฐ ์ ๋ฌ๋ ์ธ์๊ฐ ์ซ์๊ฐ ์๋๋ฉด ํด๋น ์ธ์๋ฅผ ์์๋ก ๊ฐ๋ ๋ฐฐ์ด์ ์์ฑํ๋ค.
Array.of
: Array ์์ฑ์ ํจ์์ ๋ค๋ฅด๊ฒ ์ ๋ฌ๋ ์ธ์๊ฐ 1๊ฐ์ด๊ณ ์ซ์์ด๋๋ผ๋ ์ธ์๋ฅผ ์์๋ก ๊ฐ๋ ๋ฐฐ์ด์ ์์ฑํ๋ค.
Array.from
: ์ ์ฌ ๋ฐฐ์ด ๊ฐ์ฒด ๋๋ ์ดํฐ๋ฌ๋ธ ๊ฐ์ฒด๋ฅผ ์ธ์๋ก ์ ๋ฌ๋ฐ์ ๋ฐฐ์ด๋ก ๋ณํํ์ฌ ๋ฐํํ๋ค.
const arr1 = [1, 2, 3];
const arr2 = new Array(10); // [ <10 empty items> ]
const arr3 = Array(1, 2, 3); // [1, 2, 3]
const arr4 = Array.of(1); // [1]
const arr5 = Array.from({ length: 2, 0: 'a', 1: 'b' }); // ['a', 'b']
const arr6 = Array.from('Hello'); // [ 'H', 'e', 'l', 'l', 'o' ]
const arr7 = Array.from({ length: 3 }, (_, i) => i); // [0, 1, 2]
๋ฐฐ์ด์ ์์๋ฅผ ์ถ๊ฐํ ๋ ์ ์ ์ด์ธ์ ๊ฐ์ ์ธ๋ฑ์ค์ฒ๋ผ ์ฌ์ฉํ๋ฉด ์์๊ฐ ์์ฑ๋๋ ๊ฒ์ด ์๋๋ผ ํ๋กํผํฐ๊ฐ ์์ฑ๋๋ค. ์ด๋ ์ถ๊ฐ๋ ํ๋กํผํฐ๋ length ํ๋กํผํฐ ๊ฐ์ ์ํฅ์ ์ฃผ์ง ์๋๋ค.
const arr = [];
// ๋ฐฐ์ด ์์์ ์ถ๊ฐ
arr[0] = 1;
// ํ๋กํผํฐ ์ถ๊ฐ
arr['foo'];
arr.bar = 4;
console.log(arr); // [1, foo: 3, bar: 4]
//ํ๋กํผํฐ๋ length์ ์ํฅ์ ์ฃผ์ง ์๋๋ค
console.log(arr.length); // 1
๋ฐฐ์ด์ ์ฌ์ค ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ ๋ฐฐ์ด์ ํน์ ์์๋ฅผ ์ญ์ ํ๊ธฐ ์ํด delete ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค. delete ์ฐ์ฐ์๋ฅผ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ฅผ ์ญ์ ํ๋๋ฐ ์ด๋ ๋ฐฐ์ด์ ํฌ์๋ฐฐ์ด์ด ๋๋ฉฐ length ํ๋กํผํฐ ๊ฐ์ ๋ณํ์ง ์๋๋ค.
ํฌ์ ๋ฐฐ์ด์ ๋ง๋ค์ง ์์ผ๋ฉด์ ๋ฐฐ์ด์ ํน์ ์์๋ฅผ ์์ ํ ์ญ์ ํ๋ ค๋ฉด Array.prototype.splice ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค.
๋ฐฐ์ด ๋ฉ์๋๋ ๊ฒฐ๊ณผ๋ฌผ์ ๋ฐํํ๋ ํจํด์ด ๋ ๊ฐ์ง์ด๋ฏ๋ก ์ฃผ์๊ฐ ํ์ํ๋ค. ๋ฐฐ์ด์๋ ์๋ณธ ๋ฐฐ์ด์ ์ง์ ๋ณ๊ฒฝํ๋ ๋ฉ์๋(mutator method)์ ์๋ณธ ๋ฐฐ์ด์ ์ง์ ๋ณ๊ฒฝํ์ง ์๊ณ ์๋ก์ด ๋ฐฐ์ด์ ์์ฑํ์ฌ ๋ฐํํ๋ ๋ฉ์๋(accessor method)
๊ฐ ์๋ค. ES5๋ถํฐ ๋์
๋ ๋ฐฐ์ด ๋ฉ์๋๋ ๋๋ถ๋ถ ์๋ณธ ๋ฐฐ์ด์ ์ง์ ๋ณ๊ฒฝํ์ง ์์ง๋ง ์ด์ฐฝ๊ธฐ ๋ฐฐ์ด ๋ฉ์๋๋ ์ง์ ๋ณ๊ฒฝํ๋ ๊ฒฝ์ฐ๊ฐ ์์ด ๋ถ์ ํจ๊ณผ๊ฐ ์์ผ๋ฏ๋ก ์ฌ์ฉํ ๋ ์ฃผ์ํด์ผ ํ๋ค. ๋ฐ๋ผ์ ๊ฐ๊ธ์ ์๋ณธ ๋ฐฐ์ด์ ์ง์ ๋ณ๊ฒฝํ์ง ์๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ํธ์ด ์ข๋ค.
๋ฐฐ์ด์ ํน์ ์์๊ฐ ์กด์ฌํ๋์ง ํ์ธํ ๋๋ ๊ฐ๋ ์ฑ ์ธก๋ฉด์์ indexOf ๋ณด๋ค includes ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
์๋ณธ ๋ฐฐ์ด ๋ง์ง๋ง์ ์์๋ฅผ ์ถ๊ฐํ ๋๋ push ๋ฉ์๋๋ณด๋ค length ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฐ์ด์ ๋ง์ง๋ง์ ์์๋ฅผ ์ง์ ์ถ๊ฐํ๋ ๊ฒ์ด ์ข๋ค. ๋ ์คํ๋ ๋ ๋ฌธ๋ฒ์ ์ฌ์ฉํ๋ฉด ์๋ณธ ๋ฐฐ์ด์ ์์ ์์ด ์์๋ฅผ ์ถ๊ฐํ ์ ์์ด ๋ถ์ ํจ๊ณผ๊ฐ ์๋ค.
const arr = [1, 2];
arr[arr.length] = 3; // push ๋์
const group1 = [1, 2];
const group2 = [3, 4];
const newGroup = group1.concat(group2); // [ 1, 2, 3, 4 ]
์คํ๋ ๋ ๋ฌธ๋ฒ์ ์ฌ์ฉํ๋ฉด ์ดํฐ๋ฌ๋ธ ๊ฐ์ฒด๋ฅผ ๊ฐ๋จํ๊ฒ ๋ฐฐ์ด๋ก ๋ณ๊ฒฝํ ์๋ ์๋ค.
const originalArr = [1, 2, 3];
const arr1 = [...arr, 4]; // push ๋์
const arr2 = [0, ...arr]; // unshift ๋์
์ถ์ฒ: ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ Deep Dive-์ด์ ๋ชจ