[모던 자바스크립트 Deep Dive] - 27 배열

Aneb·2022년 7월 31일
0
post-thumbnail

27.1 배열이란?

  • 배열은 여러 개의 값을 순차적으로 나열한 자료구조
  • 배열이 가지고 있는 값을 요소 라고 부른다
  • 배열의 요소는 배열에서 자신의 위치를 나타내는 0 이상의 정수인 인덱스를 갖는다.
  • 자바스크립트에 배열이라는 타입은 존재하지 않으며, 배열은 객체 타입이다.

27.2 자바스크립트 배열은 배열이 아니다

  • 자료구조에서 말하는 배열은 동일한 크기의 메모리 공간이 빈틈없이 연속적으로 나열된 자료구조를 말한다. 이러한 배열을 밀집 배열이라 한다.
  • 자바스크립트의 배열은 배열의 요소를 위한 각각의 메모리 공간이 동일한 크기를 갖지 않아도 되며, 연속적으로 이어져 있지 않을 수도 있다.( 배열의 요소가 연속적으로 이어져 있지 않은 배열을 희소 배열이라 한다. )
  • 자바스크립트의 배열은 일반적인 배열의 동작을 흉내 낸 특수한 객체다.
💡 일반적인 배열과 자바스크립트 배열의 장단점
  • 일반적인 배열은 인덱스로 ;요소에 빠르게 접근할 수 있다. 하지만 요소를 삽입 또는 삭제하는 경우에는 효율적이지 않다.
  • 자바스크립트 배열은 해시 테이블로 구현된 객체이므로, 인덱스로 요소에 접근하는 경우 일반적인 배열보다 성능적인 면에서 느릴수밖에 없는 구조적 단점이 있다. 하지만 요소를 삽입 또는 삭제하는 경우에는 일반적인 배열보다 빠른 성능을 기대할 수 있다.

27.3 length 프로퍼티와 희소 배열

  • length 프로퍼티는 배열의 길이를 나타내는 0 이상의 정수를 값으로 갖는다.
  • 빈 배열일 경우 0, 빈 배열이 아닐 경우 가장 큰 인덱스 +1
💡 length 프로퍼티 값은 배열의 길이를 바탕으로 결정되지만 임의의 숫자 값을 명시적으로 할당 할 수도 있다.
  1. 현재 length 프로퍼티 값보다 작은 숫자 값을 할당하면 배열의 길이가 줄어든다.
  2. 현재 length 프로퍼티 값보다 큰 숫자 값을 할당하면 배열의 길이가 늘어나지 않는다.
const arr=[1];

arr.length = 3; //현재 length 보다 큰 값 할당

console.log(arr.length); // 3
// length 프로퍼티는 성공적으로 변경

console.log(arr); // [1, empty x 2 ]
// arr[1],arr[2]는 값이 존재하지않음
  • 위의 예제에서 length프로퍼티는 성공적으로 변경되었지만, 실제 배열에는 아무런 변함이 없다.
  • 값 없이 비어 있는 요소를 위해 메모리 공간을 확보하지 않으며 빈 요소를 생성하지도 않는다.
  • 이처럼 배열의 배열의 요소가 연속적으로 위치하지 않고 일부가 비어 있는 배열을 희소 배열이라 한다.

27.4 배열 생성 방식

27.4.1 배열 리터럴

배열 리터럴은 0개 이상의 요소를 쉼표로 구분하여 대괄호로 묶는 방법이다.

const arr = [1,2,3];

27.4.2 Array 생성자 함수

const arr = new Array(10);

27.4.3 Array.from

Array.from 메서드는 유사 배열 객체 또는 이터러블 객체를 인수로 전달받아 배열로 변환하여 반환한다.

Array.from('Hello'); // -> ['H','e','l','l','o']

27.5 배열 요소의 참조

  • 배열의 요소를 참조할 때에는 대괄호 표기법을 사용한다.
  • 대괄호 안에는 인덱스가 와야한다.

27.6 배열 요소의 추가와 갱신

const arr =[];

arr[0] = 1; // 요소의 추가
arr[0] = 2; // 요소의 갱신

27.7 배열 요소의 삭제

//delete 연산자 사용
// -> length 프로퍼티에 영향을 주지 않으므로 희소 배열이 된다.
delete arr[1];

//splice메서드 사용
// -> length 프로퍼티가 자동 갱신되므로 희소 배열이 되지않는다.
arr.splice(1,1); //arr[1]부터 1개의 요소 제거

27.8 배열 메서드

  • 배열 메서드는 결과물을 반환하는 패턴이 두 가지가 있다.
    1. 원본배열을 직접 변경하는 메서드
    2. 원본 배열을 직접 변경하지 않고 새로운 배열을 생성하여 반환하는 메서드

27.8.1 Array.isArray

  • 전달된 인수가 배열이면 true, 아니면 false
Array.isArray([1,2]); //true

27.8.2 Array.prototype.indexOf

  • 원본 배열에서 인수로 전달된 요소를 검색하여 인덱스를 반환
const arr=[1,2,3];

arr.indexOf(2); // -> 1

27.8.3 Array.prototype.push

  • 인수로 전달받은 모든 값을 원본 배열의 마지막 요소로 추가하고 변경된 length 프로퍼티 값을 반환
const arr=[1,2];

let result= arr.push(3,4); // 바뀐 arr 의 length -> 4
console.log(arr); // [1,2,3,4]

27.8.4 Array.prototype.pop

  • 원본 배열에서 마지막 요소를 제거하고 제거한 요소를 반환한다.
  • 원본 배열이 빈 배열이면 undefined를 반환한다.
const arr =[1,2];

let result = arr.pop(); // -> 2
console.log(arr); // [1]

27.8.5 Array.prototype.unshift

  • 인수로 전달받은 모든 값을 원본 배열의 선두에 요소로 추가하고, 변경된 length 프로퍼티 값을 반환한다.
const arr=[1,2];

let result= arr.unshift(3,4); // 바뀐 arr 의 length -> 4
console.log(arr); // [3,4,1,2]

27.8.6 Array.prototype.shift

  • 원본 배열에서 첫 번째 요소를 제거하고 제거한 요소를 반환한다.
const arr=[1,2];

let result= arr.shift(); // 제거한 arr의 첫번째 요소 -> 1
console.log(arr); // [2]

27.8.7 Array.prototype.concat

  • 인수로 전달된 값들을 원본 배열의 마지막 요소로 추가한 새로운 배열을 반환한다.
const arr1=[1,2];
const arr2=[3,4];

let result= arr1.concat(arr2); // 새로운 배열 -> [1,2,3,4]
console.log(arr1); // 원본배열은 변하지 않음 -> [1,2]

27.8.8 Array.prototype.splice

  • 원본 배열의 중간에 요소를 추가하거나 중간에 있는 요소를 제거하는 경우 사용
  • splice 메서드는 3개의 매개변수가 있으며 원본 배열을 직접 변경한다.
    • start : 원본 배열의 요소를 제거하기 시작할 인덱스
    • deleteCount: 제거할 요소의 개수
    • items: 제거한 위치에 삽입할 요소 목록(옵션)
const arr=[1,2,3,4];

let result= arr.splice(1,2,20); // 제거한 요소 반환 -> [2,3]
console.log(arr); //바뀐 원본 배열 -> [1,20,4]

27.8.9 Array.prototype.slice

  • 인수로 전달된 범위의 요소들을 복사하여 배열로 반환
const arr=[1,2,3];

let result= arr.slice(0,1); // arr[0]부터 arr[1]이전까지 복사하여 반환 -> [1]

27.8.10 Array.prototype.join

  • 원본 배열의 모든 요소를 문자열로 변환한 후, 인수로 전달받은 문자열(구분자)로 연결한 문자열을 반환
const arr=[1,2,3,4];

arr.join(''); // arr의 모든 요소를 문자열로 변환한 후, 빈문자열로 연결한 후 반환 -> '1234'

27.8.11 Array.prototype.reverse

  • 원본 배열의 순서를 반대로 뒤집는다.
const arr=[1,2,3];

let result= arr.reverse(); // [3,2,1];

27.8.12 Array.prototype.fill

  • 인수로 전달받은 값을 배열의 처음부터 끝까지 요소로 채운다.
const arr=[1,2,3];

arr.fill(0);
console.log(arr); // [0,0,0]

27.8.13 Array.prototype.includes

  • 배열 내에 특정 요소가 포함되어 있는지 확인하여 true/false를 반환한다.
const arr=[1,2];

arr.include(2); // true

27.8.14 Array.prototype.flat

  • 인수로 전달받한 깊이만큼 재귀적으로 배열을 평탄화한다.
const arr=[1,[2,[3,4]]];

arr.flat(); // -> [1,2,[3,4]] //인수를 생략할 경우 기본값은 1
arr.flat(2); // -> -> [1,2,3,4] //깊이 값을 지정하여 2단계 깊이까지 평탄화
profile
FE Developer

0개의 댓글