배열의 특성
- JS의 배열은 객체이며, 인덱스와 값(index: value)을 연결하는 일종의 딕셔너리 형태임
- 예시처럼 배열을 만들 수 있음
- 인덱스는 0부터 시작함을 알면됨
const arr = [1, 2, 3];
const arr2 = new Array([1, 2, 3]);
arr[0];
arr[1];
arr[2];
arr[3] = 4;
arr.push(5);
arr[9] = 10;
arr.prop = [6, 7];
- 이는 JS도 객체이기 떄문에 속성을 가질 수 있기에
arr.prop
도 가능한 것임, 객체의 속성 일부분으로 간주되는 것
length
- 배열의 length는 길이가 아닌 배열이 가진 가장 높은 인덱스를 추적함
- 아래 예시처럼 빈 값을 인덱스를 넘어서 넣어도 길이가 4가 아닌 10이 나옴(가장 높은 인덱스를 추적하기에)
const arr = [1, 2, 3];
arr[9] = undefined;
arr.length
- length는 배열 요소 하나하나를 가지고 있는 그 총합의 길이라고 생각했지만 그게 아님
- 길이를 강제로 조작해도 바뀜(그만큼 빈 공간이 생겨버림)
arr.length = 20;
arr.length
arr.length = 0;
arr
- 이는 객체로 인식하기 때문에 초래하는 결과들임
- 그래서 length를 다룰 땐 주의해야함, 원본 배열이 망가질 수 있음
배열 순회
- 배열의 접근에 있어서 이에 대해서 반복문을 써서 순회를 할 수 있음(인덱스를 자동화해서 순회 가능, 루프를 돔)
const arr = [1, 2, 3];
for (let i = 0; i < arr.length; i++) {
console.log(arr[i]);
}
while (j < arr.length) {
console.log(arr[j]);
j = j + 1;
}
for (const value of arr) {
console.log(value);
}
for (const index in arr) {
console.log(value);
}
- 초기화를 하고 참이될 조건식을 실행하고 계속 평가하면서 값이 바뀌면서 조건을 도달할떄까지 반복을 함(그 과정이 반복됨)
- 참고자료
배열 다루기
- 앞서 끝 부분의 아이템을 넣거나, 순회해서 배열을 출력하거나, 길이를 재는 등 했음
- 이외에도 예시처럼 다양하게 배열을 다뤄서 처리해볼 수 있음
const squidMembers = ['기훈', '상우', '일남', '준호', '새벽', '알리'];
squidMemebers.push('덕수');
squidMembers.unshift('미녀');
squidMembers.indexOf('Kevin');
squidMembers.indexOf('상우');
squidMembers.lastIndexOf('상우');
squidMembers.includes('상우');
squidMembers.includes('kevin');
squidMembers.shift('미녀');
squidMembers.pop('덕수');
squidMembers.splice(2, 1);
squidMembers.splice(2, 3);
유사 배열 객체
- Array Like Object라고 함
- arguments 객체가 그 중 하나임, 중괄호로 그 안에 배열과 같은 객체처럼 가지고 있음
- 하지만 배열처럼 생겼지만 배열 메소드를 사용할 수 없음
- Node List도 비슷함, HTML Elements 하나하나가 노드로 그 Node List들은 배열과 유사하게 생김
- 배열과 유사하나 push, reduce, pop 등을 쓸 수 없음
function func() {
console.log(arguments);
console.log([1,2].__proto__)
}
func(1,2,3,4,5,6)
const nodeList = document.querySelectorAll('li')
- typeof로 해도 알 수 없음, 그래서 이럴 땐
Array.isArray
메소드로 확인할 수 있음, 이 땐 유사 배열 객체도 걸러냄
- 즉, 앞서 말한 arguments, nodelist등을 걸러낼 수 있음
- 만약, 그런데 이런 유사 배열 객체에 배열과 같은 기능을 쓰고 싶다면?
Array.from
메소드를 통해서 변환해서 배열의 메소드를 쓸 수 있음
Array.isArray(nodeList);
const covertNodeList = Array.from(nodeList);
convertNodeList.push('oh!');
- 그래서 위의 2가지 메소드를 잘 쓰면 좋음(단, 호환성 체크는 해야함)
- 배열을 특이하게 취급하기에 왜 바꿔야 하는지 그리고 이런 유사 배열 객체와 비교해서 생각하면 좋음