구분 | 객체 | 배열 |
---|---|---|
구조 | 프로퍼티 키와 프로퍼티 값 | 인텍스와 요소 |
값의 참조 | 프로퍼티 키 | 인덱스 |
값의 순서 | X | O |
length 프로퍼티 | X | O |
일반적인 배열의 동작을 흉내 낸 특수한 객체
밀집 배열(dense array): 배열의 요소는 하나의 데이터 타입으로 통일되어 있으며 서로 연속적으로 인접
검색 대상 요소의 메모리 주소 = 배열의 시작 메모리 주소 + 인덱스 * 요소의 바이트 수
ex) 메모리 주소 1000에서 시작하고 각 요소가 8바이트인 배열
- 인덱스가 0 인 요소의 메모리 주소 : 1000 + 0 * 8 = 1000
- 인덱스가 0 인 요소의 메모리 주소 : 1000 + 1 * 8 = 1008
- 인덱스가 0 인 요소의 메모리 주소 : 1000 + 2 * 8 = 1016
배열은 인덱스를 통해 효율적으로 요소에 접근할 수 있는 장점
// 선형 검색을 통해 특정요소 검색
function linearSearch(array, target) {
const length = array.length;
for(let i = 0; i < length; i++){
if (array[i] === target) return i;
}
return -1;
}
console.log(llinearSearch([1, 2, 3, 4, 5, 6], 3)); // 2
console.log(llinearSearch([1, 2, 3, 4, 5, 6], 0)); // -1
const arr = [1, 2, 3];
consol.log(arr.length); //3
arr.push(4);
console.log(arr.length); //4
arr.pop();
console.log(arr.length); // 3
// length 프로퍼티 값보다 작은 숫자 값을 할당하면 배열의 길이가 줄어듬
arr.length = 2;
console.log(arr); // [1, 2]
const arr2 = [1];
// 현재 length 프로퍼티 값인 1보다 큰 숫자 값 3을 length 프로퍼티에 할당
arr2.length = 3;
console.log(arr2.length); // 3
console.log(arr2); // [1, empty * 2]
const sparse = [, 2, , 4];
console.log(sparse.length); // 4
console.log(sparse); // [empty, 2, empty, 4]
// 배열sparse에는 인덱스가 0, 2 인요소가 존재 하지 않음
const arr = [1, , 3]; // 희소 배열
console.log(arr.length); //3
console.log(arr); // 1, empty, 3]
console.log(arr[1]); // undefiend
const arr = new Array(10);
console.log(arr); // [empty * 10]
consile.log(arr.length); // 10
// 전달된 인수가 없는 경우 빈 배열 생성
new Array(); // []
// 전달된 인수가 2개 이상이면 인수를 요소로 갖는 배열 생성
new Array(1, 2, 3); // [1, 2, 3]
// 전달된 인수가 1개지만 숫자가 아니면 인수를 요소로 갖는 배열 생성
new Array({}); // [{}]
Array.of(1); // [1]
Array.of(1, 2, 3); // [1, 2, 3]
Array.of('string'); // ['string']
//유사 배열 객체를 반환하여 배열을 생성
Array.from({ length: 2, 0: 'a', 1: 'b' }); // ['a', 'b']
// 이터러블을 변환하여 배열을 생성. 문자는 이터러블
Array.from('Hello'); // [ 'H', 'e', 'l', 'l', 'o']
// length만 존재하는 유사 배열 객체를 전달하면 undefined 요소로 채움
Array.from({ length: 3}); // [undefined, undefined, undefined]
// 두 번째 인수로 전달한 콜백 함수의 반환값으로 구성된 배열을 반환
Array.from({ length: 3 }, (_, i) => i); // [ 0, 1, 2]
💡 유사 배열 객체와 이터러블 객체
- 유사 배열 객체: 마치 배열처럼 인덱스로 프로퍼티 값 접근 가능, length 프로퍼티를 갖는 객체
- 배열처럼 for 문으로 순회가능
// 유사 배열 객체 const arrayLike = { '0': 'apple', '1': 'banana', '2': 'orange', length: 3 }; // 유사 배열 객체는 마치 배열처럼 for문으로 순회 가능 for (let i = 0; i <arrayLike.length; i++) { console.log(arrayLike[i]); // apple banana orange }
const arr = [1, 2];
console.log(arr[0]); // 1
console.log(arr[1]); // 2
console.log(arr[2]); // undefined
const arr = [0];
arr[1] = 1;
console.log(arr); // [0, 1]
console.log(arr.length); // 2
arr[100] = 100;
console.log(arr); // [0, 1, empty * 98, 100]
console.log(arr.length); // 101
// 요소 값 갱신
arr[1] = 10;
console.log(arr); // [0, 10, empty * 98, 100]
const arr = [1, 2, 3];
delete arr[1] = 1;
console.log(arr); // [1, empty, 3]
// length 프로퍼티에 영향을 주지 않음 -> 희소 배열
console.log(arr.length); // 3
const arr1 = [1, 2, 3];
// splice(삭제 시작 인덱스, 삭제할 요소 수)
arr1.splice(1, 1);
console.log(arr1); // [1, 3]
// length 프로퍼티가 자동 갱신
console.log(arr1.length); // 2
📖 참고도서 : 모던 자바스크립트 Deep Dive 자바스크립트의 기본 개념과 동작 원리 / 이웅모 저 | 위키북스