(배열도 객체)
구분 | 객체 | 배열 |
---|---|---|
구조 | 프로퍼티 키/값 | 인덱스/요소 |
값의 참조 | 프로퍼티 키 | 인덱스 |
값의 순서 | X | O |
length 프로퍼티 | X | O |
const arr1 = [1, 2, 3, 4];
arr1.length = 3;
console.log(arr1); // [1, 2, 3]
const arr2 = [1, 2, 3, 4];
arr2.length = 5;
console.log(arr2.length); // 5
console.log(arr2); // [1, 2, 3, 4, empty]
const arr1 = [1, 2, 3];
const arr2 = []; // arr2.length = 0
const arr3 = [1, , 3]; // 희소 배열
const arr = new Array(10);
console.log(arr); // [empty*10]
new Array(); // []
new Array(1, 2, 3); // [1, 2, 3]
new Array({}); // [{}]
// new 연산자 없이도 생성 가능
Array(1, 2, 3); // [1, 2, 3]
Array.of(1, 2, 3); // [1, 2, 3]
Array.from({ length: 2, 0: 'a', 1: 'b' }); // ['a', 'b']
// 문자열은 이터러블이다.
Array.from('Hi'); // ['H', 'i']
비구조화 할당
- 배열의 각 원소에 접근하지 않고 새로운 변수명을 붙일 수 있다.
const arr = [1, 2]; const [a, b, c] = arr; console.log(a); // 1 console.log(b); // 2 console.log(c); // undefined (대응하는 원소가 없는 경우, undefined 할당)
- 객체에도 적용 가능
const obj = {a: 1, b:2 } const {a: newA, b} = obj; // 새로운 변수명을 사용할 수도 있음 console.log(newA); // 1 console.log(b); // 2
const arr = [];
arr[0] = 1;
arr['1'] = 2;
arr['foo'] = 3;
arr[1.1] = 4;
console.log(arr); // [1, 2, foo: 3, '1.1': 4]
console.log(arr.length); // 2
const arr = [1, 2, 3];
delete arr[1];
console.log(arr); // [1, empty, 3]
console.log(arr.length); // 3
const arr2 = [1, 2, 3, 4];
arr2.slice(1, 2);
console.log(arr2); // [1, 4]
console.log(arr2.length); // 2
결과물 반환 패턴
- 부수 효과 O
: 원본 배열(배열 메서드를 호출한 배열, 배열 메서드 내부에서 this가 가리키는 객체) 직접 변경- 부수 효과 X
: 원본 배열 변경없이 새로운 배열을 생성하여 반환
const arr = [1, 2];
let result = arr.unshift(3, 4);
console.log(result); // 4
console.log(arr); // [3, 4, 1, 2]
arr.slice(start, deleteCount, items);
start
부터 deleteCount
만큼 제거하여 items
요소들을 삽입const arr = [1, 2, 3, 4];
const result = arr.slice(1, 2, 20, 30);
console.log(result); // 2, 3
console.log(arr); // [1, 20, 30, 4]
arr.slice(start, end);
start
부터 end-1
인덱스 범위의 요소들을 복사하여 배열로 반환const arr = [1, 2, 3];
arr.slice(0, 1); // [1]
arr.slice(-1); // [3]
console.log(arr); // [1, 2, 3] 원본 배열 변경 X
얕은 복사와 깊은 복사
- 얕은 복사: 한 단계까지만 복사하는 것
- 깊은 복사: 객체에 중첩되어 있는 객체까지 모두 복사
- slice, 스프레드 문법, Object.assign 메서드 모두 얕은 복사 수행
- 깊은 복사 수행 시, Lodash 라이브러리의
cloneDeep
메서드 사용하기
const arr = [1, 2, 3, 4];
arr.join(); // '1, 2, 3, 4'
arr.join(':'); // '1:2:3:4'
arr.fill(value);
arr.fill(value, start, end);
const arr = [1, 2, 3];
arr.fill(0, 1);
console.log(arr); // [1, 0, 0]
[1, [2, [3, 4]]].flat(); // [1, 2, [3, 4]]
ex. '10': U+0031U+0030 < '2': U+0032
['2', '10'].sort(); // ["10", "2"]
sort((a, b) => a - b);
break
, continue
사용 X[1, 2, 3].forEach((item, index, arr) => {
console.log(`요소 값: ${item}, 인덱스: ${index}, this: ${JSON.stringify(arr)}`);
});
// 요소값: 1, 인덱스: 0, this: [1, 2, 3]
// 콜백 함수 내부에서 this로 사용할 객체 전달하기
arr.forEach(function (item) {
// 생략
}, this);
// 더 좋은 방법: 화살표 함수 사용
// 화살표 함수 내부의 this는 상위 스코프의 this를 그대로 참조
const numbers = [1, 4, 9];
const roots = numbers.map(item => Math.sqrt(item));
console.log(roots); // [1, 2, 3]
console.log(numbers); // [1, 4, 9]
const numbers = [1, 2, 3, 4, 5];
const odds = numbers.filter(item => item % 2);
console.log(odds); // [1, 3, 5]
arr.reduce((accumulator, currentValue, index, array) => {
// 생략
}, 초기값);
const vaules = [1, 2, 3, 4, 5, 6];
const avg = values.reduce((acc, cur, i, {length}) => {
return i === length -1 ? (acc + cur) / length : acc + cur;
}, 0);
console.log(avg); // 3.5
[5, 10, 15].some(item => item > 10); // true
[1, 2, 2, 3].find(item => item === 2); // 2
// filter는 배열 반환
[1, 2, 2, 3].filter(item => item === 2); // [2, 2]