ν‹°μŠ€ν† λ¦¬ λ·°

λ°°μ—΄μ΄λž€?

λ°°μ—΄(array)λŠ” μ—¬λŸ¬κ°œμ˜ 값을 순차적으둜 λ‚˜μ—΄ν•œ μžλ£Œκ΅¬μ‘°μž…λ‹ˆλ‹€.

  • μš”μ†Œ(element) : 배열이 가지고 μžˆλŠ” κ°’
  • 인덱슀(index) : λ°°μ—΄μ˜ μš”μ†Œμ—μ„œ μžμ‹ μ˜ μœ„μΉ˜λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 0 μ΄μƒμ˜ μ •μˆ˜λ‘œ 배열에 μ ‘κ·Όν•  λ•Œ μ‚¬μš© (λŒ€λΆ€λΆ„μ˜ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œ μΈλ±μŠ€λŠ” 0λΆ€ν„° μ‹œμž‘)

 

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λ°°μ—΄

const arr = ['apple', 'bannana', 'orange'];

arr[0]; // 'apple'

arr.length // 3

for(let i=0;i<arr.length;i++) {
    console.log(arr[i]); // 'apple', 'bannana', 'orange'
}

typeof arr // object

arr.constructor === Array // -> true
Object.getPrototypeOf(arr) === Array.prototype // -> true

 

  • μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ κ°’μœΌλ‘œ μΈμ •ν•˜λŠ” λͺ¨λ“  것은 λ°°μ—΄μ˜ μš”μ†Œκ°€ 될 수 있음
  • λ°°μ—΄μ˜ μš”μ†Œμ— μ ‘κ·Όν•  λ•ŒλŠ” λŒ€κ΄„ν˜Έ ν‘œκΈ°λ²•μ„ μ‚¬μš©
  • λ°°μ—΄μ˜ 길이(μš”μ†Œμ˜ 개수)λ₯Ό λ‚˜νƒ€λ‚΄λŠ” length ν”„λ‘œνΌν‹°λ₯Ό κ°€μ Έμ„œ for 문을 톡해 순차적으둜 μš”μ†Œμ— μ ‘κ·Ό κ°€λŠ₯
  • 배열은 객체 νƒ€μž… (μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” λ°°μ—΄μ΄λΌλŠ” νƒ€μž…μ΄ 쑴재X)
  • λ°°μ—΄ λ¦¬ν„°λŸ΄, Array μƒμ„±μž ν•¨μˆ˜, Array.of, Array.from λ©”μ„œλ“œλ‘œ λ°°μ—΄ 생성 κ°€λŠ₯
  • λ°°μ—΄μ˜ ν”„λ‘œν† νƒ€μž… 객체 Array.prototypeλŠ” 배열을 μœ„ν•œ 빌트인 λ©”μ„œλ“œλ₯Ό 제곡

λ°°μ—΄ 객체 vs 일반 객체

ꡬ뢄 객체 λ°°μ—΄
ꡬ쑰 ν”„λ‘œνΌν‹° 킀와 ν”„λ‘œνΌν‹° κ°’ μΈλ±μŠ€μ™€ μš”μ†Œ
κ°’μ˜ μ°Έμ‘° ν”„λ‘œνΌν‹° ν‚€ 인덱슀
κ°’μ˜ μˆœμ„œ X O
length ν”„λ‘œνΌν‹° X O

 

이처럼 인덱슀둜 ν‘œν˜„λ˜λŠ” κ°’μ˜ μˆœμ„œμ™€ length ν”„λ‘œνΌν‹°λ₯Ό κ°–λŠ” 배열은 λ°˜λ³΅λ¬Έμ„ 톡해 순차적으둜 값에 μ ‘κ·Όν•˜κΈ° μ ν•©ν•œ μžλ£Œκ΅¬μ‘°μž…λ‹ˆλ‹€.


μžλ°”μŠ€ν¬λ¦½νŠΈ 배열은 배열이 μ•„λ‹ˆλ‹€

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 배열은 일반적인 λ°°μ—΄μ˜ λ™μž‘μ„ 흉내 λ‚Έ νŠΉμˆ˜ν•œ κ°μ²΄μž…λ‹ˆλ‹€.

  • 일반 λ°°μ—΄ : μžλ£Œκ΅¬μ‘°μ—μ„œ λ§ν•˜λŠ” 배열은 λ™μΌν•œ 크기의 μš”μ†Œκ°€ λ©”λͺ¨λ¦¬ 곡간에 μ—°μ†μ μœΌλ‘œ λ‚˜μ—΄λœ 밀집 λ°°μ—΄
  • μžλ°”μŠ€ν¬λ¦½νŠΈ λ°°μ—΄ : μš”μ†Œμ˜ λ©”λͺ¨λ¦¬ 곡간이 연속적이지 μ•Šμ•„λ˜λŠ” ν¬μ†Œ 배열이 κ°€λŠ₯ν•˜λ©° 각 μš”μ†Œμ˜ 크기가 달라도됨

 

이처럼 μžλ°”μŠ€ν¬λ¦½νŠΈ 배열은 인덱슀λ₯Ό λ‚˜νƒ€λ‚΄λŠ” λ¬Έμžμ—΄μ„ ν”„λ‘œνΌν‹° ν‚€λ‘œ 가지며, length ν”„λ‘œνΌν‹°λ₯Ό κ°–λŠ” νŠΉμˆ˜ν•œ κ°μ²΄μž…λ‹ˆλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈ λ°°μ—΄μ˜ μš”μ†ŒλŠ” 사싀 ν”„λ‘œνΌν‹° κ°’μœΌλ‘œ μ–΄λ–€ νƒ€μž…μ˜ 값이라도 λ°°μ—΄μ˜ μš”μ†Œκ°€ 될 수 μžˆμŠ΅λ‹ˆλ‹€.

 

일반 λ°°μ—΄κ³Ό μžλ°”μŠ€ν¬λ¦½νŠΈ λ°°μ—΄μ˜ μž₯단점

ꡬ뢄 일반 λ°°μ—΄ μžλ°”μŠ€ν¬λ¦½νŠΈ λ°°μ—΄
μž₯점 인덱슀둜 μš”μ†Œμ— λΉ λ₯΄κ²Œ μ ‘κ·Όν•  수 있음 (O(n)) μš”μ†Œλ₯Ό μ‚½μž…/μ‚­μ œν•˜λŠ” 경우 일반 배열보닀 μ„±λŠ₯이 빠름
단점 μš”μ†Œλ₯Ό μ‚½μž…/μ‚­μ œν•˜λŠ” 경우 νš¨μœ¨μ μ΄μ§€ μ•ŠμŒ ν•΄μ‹œ ν…Œμ΄λΈ”λ‘œ κ΅¬ν˜„λœ κ°μ²΄μ΄λ―€λ‘œ 인덱슀둜 μš”μ†Œμ— μ ‘κ·Όν•˜λŠ” 경우 일반적인 배열보닀 μ„±λŠ₯적인 λ©΄μ—μ„œ 느림

 

ν•˜μ§€λ§Œ λ°°μ—΄μ˜ μš”μ†Œμ— μ ‘κ·Όν•  λ•Œ 일반적인 배열보닀 느릴 μˆ˜λ°–μ— μ—†λŠ” ꡬ쑰적인 단점을 λ³΄μ™„ν•˜κΈ° μœ„ν•΄ λŒ€λΆ€λΆ„μ˜ λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 배열을 일반 객체와 κ΅¬λ³„ν•˜μ—¬ μ’€ 더 λ°°μ—΄μ²˜λŸΌ λ™μž‘ν•˜λ„λ‘ μ΅œμ ν™”ν•˜μ—¬ κ΅¬ν˜„ν–ˆμŠ΅λ‹ˆλ‹€. 


length ν”„λ‘œνΌν‹°μ™€ ν¬μ†Œ λ°°μ—΄

length ν”„λ‘œνΌν‹°λŠ” μš”μ†Œμ˜ 개수, 즉 λ°°μ—΄μ˜ 길이λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 0 μ΄μƒμ˜ μ •μˆ˜λ₯Ό κ°’μœΌλ‘œ κ°€μ§‘λ‹ˆλ‹€. length ν”„λ‘œνΌν‹°μ˜ 값은 빈 λ°°μ—΄μ˜ 경우 0이며, 빈 배열이 아닐 경우 κ°€μž₯ 큰 μΈλ±μŠ€μ— 1을 λ”ν•œ 것과 κ°™μŠ΅λ‹ˆλ‹€.

 

// 1. μΆ”κ°€/μ‚­μ œ μžλ™ κ°±μ‹ 
const arr = [1, 2, 3];
console.log(arr.length); // 3

// μš”μ†Œ μΆ”κ°€
arr.push(4);
// μš”μ†Œλ₯Ό μΆ”κ°€ν•˜λ©΄ length ν”„λ‘œνΌν‹°μ˜ 값이 μžλ™ κ°±μ‹ λœλ‹€.
console.log(arr.length); // 4

// μš”μ†Œ μ‚­μ œ
arr.pop();
// μš”μ†Œλ₯Ό μ‚­μ œν•˜λ©΄ length ν”„λ‘œνΌν‹°μ˜ 값이 μžλ™ κ°±μ‹ λœλ‹€.
console.log(arr.length); // 3


// 2. ν˜„μž¬ length 보닀 μž‘μ€ 숫자λ₯Ό ν• λ‹Ήν•˜λ©΄ 길이가 쀄어듦
console.log(arr); // [1, 2, 3]
arr.length = 1;
console.log(arr); // [1]


// 3. ν˜„μž¬ length 보닀 큰 숫자λ₯Ό ν• λ‹Ήν•˜λ©΄ 길이가 λŠ˜μ–΄λ‚˜μ§€ μ•ŠμŒ
console.log(arr); // [1]
arr.length = 3;
console.log(arr.length); // 3
console.log(arr); // [1, empty × 2]
console.log(Object.getOwnPropertyDescriptors(arr));
/*
{
  '0': {value: 1, writable: true, enumerable: true, configurable: true},
  length: {value: 3, writable: true, enumerable: false, configurable: false}
}
  1. length ν”„λ‘œνΌν‹°μ˜ 값은 배열에 μš”μ†Œλ₯Ό μΆ”κ°€ν•˜κ±°λ‚˜ μ‚­μ œν•˜λ©΄ μžλ™ 갱신됨
  2. length ν”„λ‘œνΌν‹° 값보닀 μž‘μ€ 숫자 값을 ν• λ‹Ήν•˜λ©΄ λ°°μ—΄μ˜ 길이가 쀄어듦
  3. length ν”„λ‘œνΌν‹° 값보닀 큰 숫자 값을 ν• λ‹Ήν•˜λ©΄ length ν”„λ‘œνΌν‹° 값은 λ³€κ²½λ˜λ‚˜ μ‹€μ œ λ°°μ—΄μ˜ 길이가 λŠ˜μ–΄λ‚˜μ§€ μ•ŠμŒ

3번과 같은 경우 empty x 2λŠ” μ‹€μ œλ‘œ μΆ”κ°€λœ λ°°μ—΄ μš”μ†Œκ°€ μ•„λ‹ˆλΌ λ©”λͺ¨λ¦¬ 곡간을 ν™•λ³΄ν•˜μ§€λ„ μ•ŠμœΌλ©° 빈 μš”μ†Œλ₯Ό μƒμ„±ν•˜μ§€λ„ μ•ŠμŠ΅λ‹ˆλ‹€. 이처럼 λ°°μ—΄μ˜ μš”μ†Œκ°€ μ—°μ†μ μœΌλ‘œ μœ„μΉ˜ν•˜μ§€ μ•Šκ³  일뢀가 λΉ„μ–΄ μžˆλŠ” 배열을 ν¬μ†Œ 배열이라고 ν•©λ‹ˆλ‹€.

 

ν¬μ†Œ 배열은 length와 λ°°μ—΄ μš”μ†Œμ˜ κ°œμˆ˜κ°€ μΌμΉ˜ν•˜μ§€ μ•Šκ³  lengthλŠ” ν¬μ†Œ λ°°μ—΄μ˜ μ‹€μ œ μš”μ†Œ κ°œμˆ˜λ³΄λ‹€ μ–Έμ œλ‚˜ 크기 λ•Œλ¬Έμ— 연속적인 κ°’μ˜ μ§‘ν•©μ΄λΌλŠ” λ°°μ—΄μ˜ 기본적인 κ°œλ…κ³Ό λ§žμ§€ μ•ŠμœΌλ©°, μ„±λŠ₯에도 쒋지 μ•Šμ€ 영ν–₯을 μ€λ‹ˆλ‹€.

 

λ”°λΌμ„œ 배열을 생성할 κ²½μš°μ—λŠ” 같은 νƒ€μž…μ˜ μš”μ†Œλ₯Ό μ—°μ†μ μœΌλ‘œ μœ„μΉ˜μ‹œμΌœ ν¬μ†Œ 배열을 μƒμ„±ν•˜μ§€ μ•Šλ„λ‘ μ£Όμ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.


λ°°μ—΄ 생성

객체와 λ§ˆμ°¬κ°€μ§€λ‘œ 배열도 λ‹€μ–‘ν•œ 생성 방식이 μžˆμŠ΅λ‹ˆλ‹€.

λ°°μ—΄ λ¦¬ν„°λŸ΄

κ°€μž₯ 일반적인 λ°°μ—΄ 생성 λ°©μ‹μœΌλ‘œ λ°°μ—΄ λ¦¬ν„°λŸ΄μ€ 객체 λ¦¬ν„°λŸ΄κ³Ό 달리 ν”„λ‘œνΌν‹° ν‚€κ°€ μ—†κ³  κ°’λ§Œ μ‘΄μž¬ν•©λ‹ˆλ‹€.

 

// 1. λ°°μ—΄ 생성
const arr = [1, 2, 3];
console.log(arr.length); // 3


// 2. 빈 λ°°μ—΄
const arr = [];
console.log(arr.length); // 0


// 3. ν¬μ†Œ λ°°μ—΄
const arr = [1, , 3]; // ν¬μ†Œ λ°°μ—΄
// ν¬μ†Œ λ°°μ—΄μ˜ lengthλŠ” λ°°μ—΄μ˜ μ‹€μ œ μš”μ†Œ κ°œμˆ˜λ³΄λ‹€ μ–Έμ œλ‚˜ 크닀.
console.log(arr.length); // 3
console.log(arr);        // [1, empty, 3]
console.log(arr[1]);     // undefined
  • 0개 μ΄μƒμ˜ μš”μ†Œλ₯Ό μ‰Όν‘œλ‘œ κ΅¬λΆ„ν•˜μ—¬ λŒ€κ΄„ν˜Έ([])둜 λ¬Άμ–΄μ„œ 생성
  • μš”μ†Œλ₯Ό ν•˜λ‚˜λ„ μΆ”κ°€ν•˜μ§€ μ•ŠμœΌλ©΄ κΈΈμ΄λŠ” 0인 빈 λ°°μ—΄
  • μš”μ†Œλ₯Ό μƒλž΅ν•˜λ©΄ ν¬μ†Œ 배열이 생성됨

Array μƒμ„±μž ν•¨μˆ˜

Object μƒμ„±μž ν•¨μˆ˜λ₯Ό 톡해 객체λ₯Ό 생성할 수 μžˆλ“―μ΄ Array μƒμ„±μž ν•¨μˆ˜λ₯Ό 톡해 배열을 생성할 μˆ˜λ„ μžˆλŠ”λ°, Array μƒμ„±μž ν•¨μˆ˜λŠ” μ „λ‹¬λœ 인수의 κ°œμˆ˜μ— 따라 λ‹€λ₯΄κ²Œ λ™μž‘ν•˜λ―€λ‘œ μ£Όμ˜κ°€ ν•„μš”ν•©λ‹ˆλ‹€.

 

// 1. μΈμˆ˜κ°€ 1개
const arr = new Array(10);
console.log(arr); // [empty × 10]
console.log(arr.length); // 10
console.log(Object.getOwnPropertyDescriptors(arr));
/*
{
  length: {value: 10, writable: true, enumerable: false, configurable: false}
}
*/


// 2. μ „λ‹¬λœ 인수의 λ²”μœ„ 
new Array(4294967295);
// μ „λ‹¬λœ μΈμˆ˜κ°€ 0 ~ 4,294,967,295λ₯Ό λ²—μ–΄λ‚˜λ©΄ RangeErrorκ°€ λ°œμƒν•œλ‹€.
new Array(4294967296); // RangeError: Invalid array length
// μ „λ‹¬λœ μΈμˆ˜κ°€ 음수이면 μ—λŸ¬κ°€ λ°œμƒν•œλ‹€.
new Array(-1); // RangeError: Invalid array


// 3. μΈμˆ˜κ°€ 0개
new Array(); // -> []


// 4. μ „λ‹¬λœ μΈμˆ˜κ°€ 2개 이상이면 인수λ₯Ό μš”μ†Œλ‘œ κ°–λŠ” 배열을 μƒμ„±ν•œλ‹€.
new Array(1, 2, 3); // -> [1, 2, 3]

// 5. μ „λ‹¬λœ μΈμˆ˜κ°€ 1κ°œμ§€λ§Œ μˆ«μžκ°€ μ•„λ‹ˆλ©΄ 인수λ₯Ό μš”μ†Œλ‘œ κ°–λŠ” 배열을 μƒμ„±ν•œλ‹€.
new Array({}); // -> [{}]

// 6. new μ—°μ‚°μž μƒλž΅ κ°€λŠ₯
Array(1, 2, 3); // -> [1, 2, 3]
  • μ „λ‹¬λœ μΈμˆ˜κ°€ 1개이고 숫자인 경우 length ν”„λ‘œνΌν‹° 값이 인수인 배열을 생성 (ν¬μ†Œ λ°°μ—΄λ‘œ λ°°μ—΄μ˜ μš”μ†Œ X)
  • 배열은 μš”μ†Œλ₯Ό μ΅œλŒ€ 2^23 - 1개λ₯Ό κ°€μ§ˆ 수 있으며 μ „λ‹¬λœ μΈμˆ˜κ°€ λ²”μœ„λ₯Ό λ²—μ–΄λ‚˜λ©΄ RangeErrorκ°€ λ°œμƒ
  • μ „λ‹¬λœ μΈμˆ˜κ°€ μ—†λŠ” 경우 빈 배열을 생성
  • μ „λ‹¬λœ μΈμˆ˜κ°€ 2개 μ΄μƒμ΄κ±°λ‚˜ μˆ«μžκ°€ μ•„λ‹Œ 경우 인수λ₯Ό μš”μ†Œλ‘œ κ°–λŠ” 배열을 생성
  • Array μƒμ„±μž ν•¨μˆ˜λŠ” new μ—°μ‚°μž 없이 일반 ν•¨μˆ˜λ‘œμ„œ ν˜ΈμΆœν•΄λ„ μƒμ„±μž ν•¨μˆ˜λ‘œ λ™μž‘ (Array μƒμ„±μž ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ new.targe을 확인)

Array.of

ES6μ—μ„œ λ„μž…λœ Array.of λ©”μ„œλ“œλŠ” μ „λ‹¬λœ 인수λ₯Ό μš”μ†Œλ‘œ κ°–λŠ” 배열을 μƒμ„±ν•©λ‹ˆλ‹€. Array μƒμ„±μžμ™€ λ‹€λ₯΄κ²Œ μ „λ‹¬λœ μΈμˆ˜κ°€ 1개이고 μˆ«μžμ΄λ”λΌλ„ 인수λ₯Ό μš”μ†Œλ‘œ κ°–λŠ” 배열을 μƒμ„±ν•©λ‹ˆλ‹€.

 

// μ „λ‹¬λœ μΈμˆ˜κ°€ 1개이고 μˆ«μžμ΄λ”λΌλ„ 인수λ₯Ό μš”μ†Œλ‘œ κ°–λŠ” 배열을 μƒμ„±ν•œλ‹€.
Array.of(1); // -> [1]

Array.of(1, 2, 3); // -> [1, 2, 3]

Array.of('string'); // -> ['string']

 

Array.from

ES6μ—μ„œ λ„μž…λœ Array.from λ©”μ„œλ“œλŠ” μœ μ‚¬ λ°°μ—΄ 객체 λ˜λŠ” μ΄ν„°λŸ¬λΈ” 객체λ₯Ό 인수둜 전달받아 λ°°μ—΄λ‘œ λ³€ν™˜ν•˜μ—¬ λ°˜ν™˜ν•©λ‹ˆλ‹€.

Array.from λ©”μ„œλ“œλŠ” 두 번째 인수둜 μ „λ‹¬ν•œ 콜백 ν•¨μˆ˜μ— 첫 번째 μΈμˆ˜μ— μ˜ν•΄ μƒμ„±λœ λ°°μ—΄μ˜ μš”μ†Œκ°’κ³Ό 인덱슀λ₯Ό 순차적으둜 μ „λ‹¬ν•˜λ©΄μ„œ ν˜ΈμΆœν•˜κ³ , 콜백 ν•¨μˆ˜μ˜ λ°˜ν™˜κ°’μœΌλ‘œ κ΅¬μ„±λœ 배열을 λ°˜ν™˜ν•©λ‹ˆλ‹€.

 

// μœ μ‚¬ λ°°μ—΄ 객체λ₯Ό λ³€ν™˜ν•˜μ—¬ 배열을 μƒμ„±ν•œλ‹€.
Array.from({ length: 2, 0: 'a', 1: 'b' }); // -> ['a', 'b']

// μ΄ν„°λŸ¬λΈ”μ„ λ³€ν™˜ν•˜μ—¬ 배열을 μƒμ„±ν•œλ‹€. λ¬Έμžμ—΄μ€ μ΄ν„°λŸ¬λΈ”μ΄λ‹€.
Array.from('Hello'); // -> ['H', 'e', 'l', 'l', 'o']

// Array.from에 length만 μ‘΄μž¬ν•˜λŠ” μœ μ‚¬ λ°°μ—΄ 객체λ₯Ό μ „λ‹¬ν•˜λ©΄ undefinedλ₯Ό μš”μ†Œλ‘œ μ±„μš΄λ‹€.
Array.from({ length: 3 }); // -> [undefined, undefined, undefined]

// Array.from은 두 번째 인수둜 μ „λ‹¬ν•œ 콜백 ν•¨μˆ˜μ˜ λ°˜ν™˜κ°’μœΌλ‘œ κ΅¬μ„±λœ 배열을 λ°˜ν™˜ν•œλ‹€.
Array.from({ length: 3 }, (_, i) => i); // -> [0, 1, 2]

 

이처럼 Array.from은 두 번째 인수둜 μ „λ‹¬ν•œ 콜백 ν•¨μˆ˜λ₯Ό 톡해 값을 λ§Œλ“€λ©΄μ„œ μš”μ†Œλ₯Ό μ±„μšΈ 수 μžˆμŠ΅λ‹ˆλ‹€.


λ°°μ—΄ μš”μ†Œμ˜ μ°Έμ‘°

const arr = [1, 2];

// μΈλ±μŠ€κ°€ 0인 μš”μ†Œλ₯Ό μ°Έμ‘°
console.log(arr[0]); // 1
// μΈλ±μŠ€κ°€ 1인 μš”μ†Œλ₯Ό μ°Έμ‘°
console.log(arr[1]); // 2

// μΈλ±μŠ€κ°€ 2인 μš”μ†Œλ₯Ό μ°Έμ‘°. λ°°μ—΄ arrμ—λŠ” μΈλ±μŠ€κ°€ 2인 μš”μ†Œκ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€.
console.log(arr[2]); // undefined
  • λ°°μ—΄μ˜ μš”μ†Œλ₯Ό μ°Έμ‘°ν•  λ•Œμ—λŠ” λŒ€κ΄„ν˜Έ([]) ν‘œκΈ°λ²•μ„ μ‚¬μš©
  • λŒ€κ΄„ν˜Έ μ•ˆμ—λŠ” μΈλ±μŠ€κ°€ 와야 ν•˜μ§€λ§Œ, μ •μˆ˜λ‘œ ν‰κ°€λ˜λŠ” ν‘œν˜„μ‹μ΄λΌλ©΄ 인덱슀 λŒ€μ‹  μ‚¬μš© κ°€λŠ₯
  • μΈλ±μŠ€λŠ” 값을 μ°Έμ‘°ν•  수 μžˆλ‹€λŠ” μ˜λ―Έμ—μ„œ 객체의 ν”„λ‘œνΌν‹° 킀와 같은 역할을 함
  • μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” μš”μ†Œμ— μ ‘κ·Όν•˜λ©΄ undefinedκ°€ λ°˜ν™˜

λ°°μ—΄ μš”μ†Œμ˜ 좔가와 κ°±μ‹ 

// 1. μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 인덱슀둜 값을 ν• λ‹Ήν•˜λ©΄ μžλ™ κ°±μ‹ 
const arr = [0];
// λ°°μ—΄ μš”μ†Œμ˜ μΆ”κ°€
arr[1] = 1;
console.log(arr); // [0, 1]
console.log(arr.length); // 2

// 2. ν˜„μž¬ λ°°μ—΄μ˜ length ν”„λ‘œνΌν‹° 값보닀 큰 인덱슀둜 μΆ”κ°€ν•˜λ©΄ ν¬μ†Œ 배열이 됨
arr[100] = 100;
console.log(arr); // [0, 1, empty × 98, 100]
console.log(arr.length); // 101

// 3. μ •μˆ˜ μ΄μ™Έμ˜ 값을 인덱슀둜 μ‚¬μš©ν•˜λ©΄ μš”μ†Œ λŒ€μ‹  ν”„λ‘œνΌν‹°κ°€ 생성됨(length 영ν–₯ X)
const arr = [];

// λ°°μ—΄ μš”μ†Œμ˜ μΆ”κ°€
arr[0] = 1;
arr['1'] = 2;

// ν”„λ‘œνΌν‹° μΆ”κ°€
arr['foo'] = 3;
arr.bar = 4;
arr[1.1] = 5;
arr[-1] = 6;

console.log(arr); // [1, 2, foo: 3, bar: 4, '1.1': 5, '-1': 6]

// ν”„λ‘œνΌν‹°λŠ” length에 영ν–₯을 주지 μ•ŠλŠ”λ‹€.
console.log(arr.length); // 2
  • μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 인덱슀λ₯Ό μ‚¬μš©ν•΄ 값을 ν• λ‹Ήν•˜λ©΄ μƒˆλ‘œμš΄ μš”μ†Œκ°€ μΆ”κ°€λ˜κ³  length ν”„λ‘œνΌν‹° 값이 μžλ™ κ°±μ‹ 
  • λ§Œμ•½ ν˜„μž¬ λ°°μ—΄μ˜ length ν”„λ‘œνΌν‹° 값보닀 큰 인덱슀둜 μƒˆλ‘œμš΄ μš”μ†Œλ₯Ό μΆ”κ°€ν•˜λ©΄ ν¬μ†Œ 배열이 됨
  • μΈλ±μŠ€λŠ” λ°˜λ“œμ‹œ 0 μ΄μƒμ˜ μ •μˆ˜λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•˜λ―€λ‘œ μ •μˆ˜ μ΄μ™Έμ˜ 값을 μ‚¬μš©ν•˜λ©΄ μš”μ†Œκ°€ μƒμ„±λ˜μ§€ μ•Šκ³  ν”„λ‘œνΌν‹°κ°€ μƒμ„±λ˜λŠ”λ°, μ΄λ•Œ μΆ”κ°€λœ ν”„λ‘œνΌν‹°λŠ” length ν”„λ‘œνΌν‹° 값에 영ν–₯을 주지 μ•ŠμŒ

λ°°μ—΄ μš”μ†Œμ˜ μ‚­μ œ

배열은 사싀 객체이기 λ•Œλ¬Έμ— λ°°μ—΄μ˜ νŠΉμ • μš”μ†Œλ₯Ό μ‚­μ œν•˜κΈ° μœ„ν•΄ delete μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•  수 있고 Array.prototype.splice λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

// 1. delete μ—°μ‚°μž
const arr = [1, 2, 3];

// λ°°μ—΄ μš”μ†Œμ˜ μ‚­μ œ
delete arr[1];
console.log(arr); // [1, empty, 3]

// length ν”„λ‘œνΌν‹°μ— 영ν–₯을 주지 μ•ŠλŠ”λ‹€. 즉, ν¬μ†Œ 배열이 λœλ‹€.
console.log(arr.length); // 3


// 2. splice λ©”μ„œλ“œ
const arr = [1, 2, 3];

// Array.prototype.splice(μ‚­μ œλ₯Ό μ‹œμž‘ν•  인덱슀, μ‚­μ œν•  μš”μ†Œ 수)
// arr[1]λΆ€ν„° 1개의 μš”μ†Œλ₯Ό 제거
arr.splice(1, 1);
console.log(arr); // [1, 3]

// length ν”„λ‘œνΌν‹°κ°€ μžλ™ κ°±μ‹ λœλ‹€.
console.log(arr.length); // 2
  • delete μ—°μ‚°μžλŠ” 객체의 ν”„λ‘œνΌν‹°λ₯Ό μ‚­μ œν•˜κ³  ν¬μ†Œ 배열을 λ§Œλ“€μ–΄μ„œ μ‚¬μš©ν•˜λŠ” 것은 쒋지 μ•ŠμŒ
  • Array.prototype.splice λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ ν¬μ†Œ 배열을 λ§Œλ“€μ§€ μ•ŠμœΌλ©΄μ„œ λ°°μ—΄μ˜ νŠΉμ • μš”μ†Œλ₯Ό μ™„μ „νžˆ μ‚­μ œ κ°€λŠ₯

[좜처] λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive

https://wikibook.co.kr/mjs/

 

λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive: μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ κΈ°λ³Έ κ°œλ…κ³Ό λ™μž‘ 원리

269개의 κ·Έλ¦Όκ³Ό 원리λ₯Ό νŒŒν—€μΉ˜λŠ” μ„€λͺ…μœΌλ‘œ ‘μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ κΈ°λ³Έ κ°œλ…κ³Ό λ™μž‘ 원리’λ₯Ό μ΄ν•΄ν•˜μž! μ›ΉνŽ˜μ΄μ§€μ˜ λ‹¨μˆœν•œ 보쑰 κΈ°λŠ₯을 μ²˜λ¦¬ν•˜κΈ° μœ„ν•œ μ œν•œμ μΈ μš©λ„λ‘œ νƒœμ–΄λ‚œ μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 과도

wikibook.co.kr