요약!
- 배열은 1) length가 있다. 2) index가 0부터 시작해서 1씩 증가한다.
- 유사배열의 조건도 위와 같다.
1) length 속성을 포함해야한다.
2) 숫자 형태의 index가 존재해야한다.
- 유사배열은 array가 아니다! (Array.isArray(유사배열) === false)
1. 유사배열이란?
유사배열(array-like objects)은 배열처럼 대괄호로 감싸져 있으며 각 요소가 indexing을 통해 담겨져 있는 형태를 띈다.
유사배열은 함수에서 처리 결과로 배열을 반환하고 싶을 때, Array에서 기본으로 내포되어있는 기능을 제공하고 싶지 않거나 Array에 내포되어있지 않은 기능을 제공하고 싶을 때 사용한다.
2. 유사배열의 예
사진처럼 페이지 내의 특정한 선택자를 가진 노드를 불러왔을때 List는 배열처럼 보이지만 유사배열 객체이다.
// 유사배열은 아래와 같은 형태로 선언하면 된다. 반드시 length를 가져야한다.
let arrLikedObject = {0: 't', 1: 'e', 2: 's', 3: 't', length: 4};
console.log(arrLikedObject[0]); // 't'
console.log(arrLikedObject[1]); // 'e'
3. 유사배열과 배열의 비교
//배열
let array = ['t','e','s','t'];
//유사배열
let arrayLikeObject = {0: 't', 1: 'e', 2: 's', 3: 't', length: 4};
//두개 다 object array구조는 object에 포함된다.
console.log(typeof array); //object
console.log(typeof arrayLikedObject); //object
console.log(Array.isArray(array)); // true
console.log(Array.isArray(arrayLikeObject)); // false
또 유사배열은 배열의 내장 함수를 사용할 수 없다.
//배열
let array = ['t','e','s','t'];
//유사배열
let arrayLikeObject = {0: 't', 1: 'e', 2: 's', 3: 't', length: 4};
//forEach는 배열 iterator함수
array.forEach(el => console.log(el)); // t,e,s,t
//유사배열은 forEach 사용하면 Error남!
arrayLikeObject.forEach(el=> console.log(el)); Uncaught TypeError: forEach is not a function
4. 유사배열이 배열의 내장 함수를 사용하는 방법
4-1. Array.from() (ES6)를 이용해서 진짜 배열로 바꿔준다.
//유사배열
let arrayLikeObject = {0: 't', 1: 'e', 2: 's', 3: 't', length: 4};
// Array.from을 통해서 유사배열을 진짜 배열로 바꿔줌
let convertToArray = Array.from(arrayLikeObject);
//배열이 됫구요
console.log(Array.isArray(convertToArray)); // true
// 이제 forEach도 사용 ssap가능합니다.
convertToArray.forEach(el=> console.log(el)); // t,e,s,t
4-2. call 과 apply를 사용해서 배열의 내장 함수를 사용할 수 있다.
//유사배열
let arrayLikeObject = {0: 't', 1: 'e', 2: 's', 3: 't', length: 4};
// TypeError: arrayLikeObject.forEach is not a function
arrayLikeObject.forEach(el=> console.log(el));
//call을 사용해서 Array.prototype 내장 함수를 사용할 수 있다.
Array.prototype.forEach.call(arrayLikeObject, el => {console.log(el)}); // t,e,s,t
잘못된 정보에 대한 피드백은 언제나 환영입니다 (´▽`ʃƪ)♡
참고: https://poizon.tistory.com/11, https://kamang-it.tistory.com/entry/JavaScript15%EC%9C%A0%EC%82%AC%EB%B0%B0%EC%97%B4-%EA%B0%9D%EC%B2%B4Arraylike-Objects
'내직업은 IT종사자 > javascript' 카테고리의 다른 글
[javascript] javascript는 메모리관리가 어떻게 될까? (feat. 메모리 누수 사례) (0) | 2023.06.04 |
---|---|
[javascript] 변수 참조타입 메모리 접근 방식, 참조타입 복사가 필요한 이유 (shallow copy, deep copy) (0) | 2023.06.01 |
[javascript] 배열 생성하는 여러가지 방법(ES6) (배열생성자 new Array() / Array.of() / Array.from() ) (0) | 2023.04.17 |
[javascript] 다차원 배열을 일차원으로 변경하는 방법 flat(), flatMap(), map() (1) | 2023.03.14 |
[javascript] 헷갈리고 짜증유발 증감연산자 (0) | 2023.03.09 |