2025. 8. 29. 18:47ㆍCoding Study/Javascript
자바스크립트에 배열 타입은 존재하지 않는다. 배열을 객체 타입이다.
typeof arr // object
객체와 배열의 특징
| 구분 | 객체 | 배열 |
| 구조 | 키와 값 | 인덱스와 요소 |
| 값의 참조 | 키 | 인덱스 |
| 값의 순서 | X | O |
| length 프로퍼티 | X | O |
배열은 반복문을 통해 순차적으로 값에 접근하기 적합한 자료구조이다
희소배열
현재 length 에 프로퍼티 값보다 작은 숫자 값을 할당하면 배열의 길이가 줄어든다.
const arr = ["a", "b", "c", "d", "e"];
arr.length = 3;
console.log(arr); // [ 'a', 'b', 'c' ]
현재 length 에 프로퍼티 값인 1보다 큰숫자 3을 length 프로퍼티에 할당하면, length 프로퍼티 값은 변경 되지만
실제로 배열의 길이가 늘어나지는 않는다.
const arr = ["a"];
arr.length = 3;
console.log(arr); // [ 'a', <2 empty items> ]
console.log(Object.getOwnPropertyDescriptors(arr));
/*
{
'0': { value: 'a', writable: true, enumerable: true, configurable: true },
length: { value: 3, writable: true, enumerable: false, configurable: false }
}
*/
배열의 요소가 연속적으로 위치하지 않고 일부가 비어 있는 배열을 희소 배열
자바스크립트는 희소배열을 문법적으로 허용
하지만 희소배열은 사용하지 않는 것이 좋다.
- 연속적인 값이라는 배열의 기본개념과 맞지 않음
const arr = [, "b", , , "e"];
console.log(arr.length); //5
console.log(arr); // [ <1 empty item>, 'b', <2 empty items>, 'e' ]
console.log(Object.getOwnPropertyDescriptors(arr));
/*
{
'1': { value: 'b', writable: true, enumerable: true, configurable: true },
'4': { value: 'e', writable: true, enumerable: true, configurable: true },
length: { value: 5, writable: true, enumerable: false, configurable: false }
}
*/
배열 생성 방법
1. 배열 리터럴로 배열 생성하기
const arr = ["A","B","C" ]
2. Array 생성자 함수
전달된 인수가 1개이고 숫자인 경우 인수 값이 length 인 배열 생성
실제로 요소는 존재하지 않음
const arr = new Array(10);
console.log(arr); // [ <10 empty items> ]
console.log(arr.length); // 10
인수 값이 2개 이상 이거나 숫자가 아닌경우에는 요소로 갖는 배열 생성
const arr = new Array(10, 11, 12);
console.log(arr); // [ 10, 11, 12 ]
const arr2 = new Array("가");
console.log(arr2); // [ '가' ]
new 연산자와 함께 호출 하지 않아도 똑같이 동작 한다.
const arr = Array(10, 11, 12);
console.log(arr); // [ 10, 11, 12 ]
const arr2 = Array("가");
console.log(arr2); // [ '가' ]
3. Array.of
ES6에서 도입되었으며 Array 생성자 함수와는 다르게 1개의 숫자라도 인수를 요소로 갖는 배열을 생성한다.
const arr = Array.of(1);
console.log(arr); // [ 1 ]
4. Array.from
ES6에서 도입되었으며 유사배열객체 또는 이터러블 객체를 인수로 전달받아 배열로 변환하여 반환한다.
이터러블을 변환하여 배열을 생성한다.문자열은 이터러블이다.
const arr = Array.from("abcde");
console.log(arr); // [ 'a', 'b', 'c', 'd', 'e' ]
*이터러블 객체 : symbol.iterator 메서드를 구현하여 for..of 문으로 순회 가능. 스프레드 문법과 배열 구조분해 문법으로 할당하여 사용사능한 객체이다. (ex. Array, String, Map, argments ..... )
length 프로퍼티만 있는 유사배열객체를 넣으면, undefined 로 채워진다.
const arr = Array.from({ length: 3 });
console.log(arr); // [ undefined, undefined, undefined ]
*유사배열 객체 : 배열처럼 인덱스로 프로퍼티 값에 접근할 수 있고, length 프로퍼티를 갖는 객체. for 문으로 순회할 수 있다.
배열 요소 참조
대괄로 표기법으로 참조가 가능하다.
const arr = ["a", "b"];
console.log(arr[0]); // a
console.log(arr[1]); // b
배열 매서드 ( 빨간색 표시는 원본 배열 변경)
Array.isArray
배열이면 true, 아니면 false
// true
Array.isArray([]);
Array.isArray([1, 2]);
Array.isArray(new Array());
// false
Array.isArray();
Array.isArray({});
Array.isArray(null);
Array.isArray(undefined);
Array.isArray(1);
Array.isArray('Array');
Array.isArray(true);
Array.isArray(false);
Array.isArray({ 0: 1, length: 1 })
Array.prototype.indexof
전달된 인수가 배열에 있다면 첫번째로 검색된 요소의 인덱스 반환
없으면 -1 을 반환한다.
두번째 인자는 검색을 시작할 인덱스 이다.
const arr = ["a", "b", "c", "d"];
console.log(arr.indexOf("a")); // 1
console.log(arr.indexOf("A")); // -1
console.log(arr.indexOf("b", 2)); // -1
console.log(arr.indexOf("c", 2)); // 2
Array.prototype.push
배열의 끝 부분에 요소 추가하고 배열의 길이를 반환한다.
const arr = [4, 5, 6, 7];
const result = arr.push(8);
console.log(result); // 5
console.log(arr); // [ 4, 5, 6, 7, 8 ]
Array.prototype.pop
배열의 끝 부분 요소 제거하고 제거된 요소를 반환한다.
const arr = [4, 5, 6, 7];
const result = arr.pop();
console.log(result); // 5
console.log(arr); // [ 4, 5, 6 ]
Array.prototype.unshift
배열의 첫 부분 요소 추가하고 배열의 길이를 반환한다.
const arr = [4, 5, 6, 7];
const result = arr.unshift(2, 3);
console.log(result); // 6
console.log(arr); // [ 2, 3, 4, 5, 6, 7 ]
Array.prototype.shift
배열의 첫 부분 요소 제거하고 제거된 요소를 반환한다.
const arr = [4, 5, 6, 7];
const result = arr.shift();
console.log(result); // 4
console.log(arr); // [ 5, 6, 7 ]
Array.prototype.concat
인수로 전달된 배열 또는 값을 원본 배열의 마지막 요소로 추가 하여 새로운 배열을 반환한다.
const arr1 = [4, 5, 6, 7];
const arr2 = [8, 9];
const result = arr1.concat(arr2);
console.log(result); // [ 4, 5, 6, 7, 8, 9 ]
스프레드 문법으로 대체 가능
const result = [ ...arr1, ...arr2 ]
Array.prototype.splice
원본 배열의 중간에 요소를 추가하거나 중간에 있는 요소를 제거하는 경우 사용한다.
splice(start, deleteCount, items)
start : 원본 배열 요소 제거 시작 인덱스
deleteCount : start 부터 제거한 요소 개수
items (옵션 ) : 제거한 위치에 삽입할 요소
const arr = [4, 5, 6, 7];
//인덱스 1 부터 2개 요소를 제거하고 그 자리에 새로운 요소 50, 60, 70 을 삽입한다.
const result = arr.splice(1, 2, 50, 60, 70);
console.log(result); // [ 5, 6 ]
console.log(arr); // [ 4, 50, 60, 70, 7 ]
Array.prototype.slice
전달된 인자의 범위를 복사하여 배열로 반환한다.
const arr = [4, 5, 6, 7];
// 배열 인덱스 1에서 인덱스 3이전(3포함x) 까지의 숫자를 복사하여 반환
const result = arr.slice(1, 3);
console.log(result); // [ 5, 6 ]
Array.prototype.join
원본 배열의 모든 요소를 문자열로 변환 후 구분자로 연결한 문자열을 반환한다.
기본 구분자는 콤마(",") 다.
const arr = [4, 5, 6, 7];
const result = arr.join();
console.log(result); // 4,5,6,7
const result2 = arr.join("");
console.log(result2); // 4567
Array.prototype.reverse
배열의 순서를 뒤집는다. 원본 배열이 변경된다.
const arr = [4, 5, 6, 7];
const result = arr.reverse();
console.log(result); // [ 7, 6, 5, 4 ]
console.log(arr); // [ 7, 6, 5, 4 ]
Array.prototype.fill
ES6 에서 도입 되었으며, 전달받은 인수로 배열의 모두 채운다.
const arr = [4, 5, 6, 7];
const result = arr.fill(1);
console.log(result); // [ 1, 1, 1, 1 ]
console.log(arr); // [ 1, 1, 1, 1 ]
Array.prototype.includes
ES7 에 도입 되었으며 전달된 인자가 배열에 있으면 true 없으면 false를 반환한다.
const arr = ["a", "b", "c", "d"];
console.log(arr.includes("a")); // true
console.log(arr.includes("A")); // fasle
두 번째 인수로 시작 인덱스를 설정 할 수 있다.
두 번째 인수가 음수일 경우 시작 인덱스는 lengrh + index 가 된다.
indexOf 는 NaN 을 확인할 수 없다.
[NaN].indexOf(NaN) !== -1; // -> false
[NaN].includes(NaN); // -> true
Array.prototype.flat
ES10(ECMAScript 2019) 에서 도입되었으며, 인수로 전달한 깊이만큼 배열을 평탄화 한다.
const arr = [4, [5, [6, [7]]]];
const result = arr.flat();
console.log(result); // [ 4, 5, [ 6, [ 7 ] ] ]
const result2 = arr.flat(2);
console.log(result2); // [ 4, 5, 6, [ 7 ] ]
const result3 = arr.flat(3);
console.log(result3); // [ 4, 5, 6, 7 ]
배열고차 함수
Array.prototype.sort ( Sort 실행순서 분석 참조 )
기본적으로 오름 차순으로 요소를 정렬
내림차순으로 정렬하고 싶으면 reverse 매서드 사용
const arr = ["d", "p", "k", "z", "a", "b"];
const result = arr.sort();
console.log(result); // [ 'a', 'b', 'd', 'k', 'p', 'z' ]
console.log(arr); // [ 'a', 'b', 'd', 'k', 'p', 'z' ]
sort 매서드는 기본 정렬 순서를 유니코드 코드 포인트의 순서를 따른다.
그래고 배열의 요소를 일시적으로 문자열로 변환한 후 정렬 하기 때문에 숫자는 아래와 같이 정렬 된다.
const arr = [10, 1, 2, 17, 100, 40, 30];
const result = arr.sort();
console.log(result); // [ 1, 10, 100, 17, 2, 30, 40 ]
console.log(arr); // [ 1, 10, 100, 17, 2, 30, 40 ]
const arr = [10, 1, 2, 17, 100, 40, 30];
//숫자 배열 오름차순 정렬
arr.sort((a, b) => a - b);
console.log(arr); // [ 1, 2, 10, 17, 30, 40, 100 ]
//숫자 배열 내림차순 정렬
arr.sort((a, b) => b - a);
console.log(arr); // [ 100, 40, 30, 17, 10, 2, 1 ]
Array.prototype.forEach
forEach 메서드는 for문을 대체할 수 있는 고차 함수
배열의 요소를 콜백 함수로 전달받아 순차적으로 실행 한다.
// forEach 메서드는 콜백 함수를 호출하면서 3개(요소값, 인덱스, this)의 인수를 전달한다.
[1, 2, 3].forEach((item, index, arr) => {
console.log(`요소값: ${item}, 인덱스: ${index}, this: ${JSON.stringify(arr)}`);
});
/*
요소값: 1, 인덱스: 0, this: [1,2,3]
요소값: 2, 인덱스: 1, this: [1,2,3]
요소값: 3, 인덱스: 2, this: [1,2,3]
*/
Array.prototype.map
<map 매서드의 구조>
첫번째 인자 : callback 함수
두번째 인자 : (생략가능) 콜백 함수 내부에서 this 로 인식할 대상 특정 생략 시 this 는 전역 객체
Array.prototype.map(callback[, thisArg])
callback : function(currentValue, index, array)
map 매서드의 callback 함수의 첫번째 인자에 index 두번째 인자에 currentValue 를 작성 하였다.
하지만 순서에 따라서 인자를 인식 하기 때문에 index 에 배열의 값이 들어가고, currentValue 에 배열의 index 값이 전달된다.
const newArr2 = [10, 20, 30].map(function(index, currentValue) {
console.log(index, currentValue);
return currentValue + 5;
});
console.log(newArr2);
// -- 실행 결과 --
// 10 0
// 20 1
// 30 2
// [5, 6, 7]
Array.prototype.filter
자신을 호출한 배열에서 필터링 조건을 만족하는 특정 요소만 추출하여 새로운 배열을 만들고 싶을 때 사용 한다.
콜백 함수의 반환값이 ture인 값만 배열로 반환한다.
const arr = [10, 1, 2, 17, 100, 40, 30];
const result = arr.filter((el) => el > 20);
console.log(result); // [ 100, 40, 30 ]
Array.prototype.reduce
콜백 인자의 a 에는 이전에 계산한 값이 들어가고 b에는 현재 순회중인 배열의 값이 들어간다.
const arr = [10, 1, 2, 17, 100, 40, 30];
// 배열의 모든 값을 곱하기
const result = arr.reduce((a, b) => a * b);
console.log(result); // 40800000
// 배열의 모든 값을 더하기
const result2 = arr.reduce((a, b) => a + b);
console.log(result2); // 200
Array.prototype.some
배열의 요소중 1개라도 참이면 true를 반환한다. 모두 틀리면 false
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10].some((el) => el < 2); // true
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10].some((el) => el > 10); // fasle
Array.prototype.every
배열의 요소가 모두 참이어야 true를 반환한다. 1개라도 틀리면 false
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10].every((el) => el > 0); // true
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10].every((el) => el < 2); // false
Array.prototype.find
배열의 요소중 참인값 첫번째 요소 1개만 반환
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10].find((el) => el > 3); // 4
// filter 는 모두 배열로 반환한다.
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10].find((el) => el > 3); //[ 4, 5, 6, 7, 8, 9, 10 ]
Array.prototype.findindex
Array.prototype.flatMap
map 메서드와 flat메서드를 순차적으로 실행하는 효과
대신 평탄화 깊이 지정할 수 없고 1단계만 평탄화 한다.
중첩 배열의 평탄화 깊이를 지정해야 한다면 map 메서드와 flat 메서드를 각각 호출 한다.
const arr = ["abcd", "efghi"];
const result = arr.map((el) => el.split(""));
console.log(result); // [ [ 'a', 'b', 'c', 'd' ], [ 'e', 'f', 'g', 'h', 'i' ] ]
console.log(result.flat()); // [ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i' ]
const result2 = arr.flatMap((el) => el.split(""));
console.log(result2); //// [ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i' ]
'Coding Study > Javascript' 카테고리의 다른 글
| 클래스 (2) | 2025.06.02 |
|---|---|
| prototype (0) | 2025.05.24 |
| 콜백 함수 (0) | 2025.05.10 |
| 실행 컨택스트 (0) | 2025.04.23 |
| 자바스크립트 var, let, const 키워드 (0) | 2025.04.18 |