이 영역을 누르면 첫 페이지로 이동
lucid_dream 블로그의 첫 페이지로 이동

lucid_dream

페이지 맨 위로 올라가기

lucid_dream

다양한 상상을 현실로 만드는 멀티 크리에이터를 꿈꾸고 있습니다 ❤️

유사 배열 객체 만들기

  • 2021.10.02 22:57
  • 🌈 기술스택/JavaScript
글 작성자: NoHack
728x90

Array-like Object

유사 배열 객체는 말 그대로 배열과 유사한 객체이며, 배열처럼 인덱스를 통해 요소에 접근할 수 있습니다.

유사 배열 객체 만들기

유사 배열 객체를 만드는 방법은 간단합니다. 객체 리터럴인 {} 안에 인덱스를 프로퍼티로 하여 값을 적어주고, 이러한 값의 개수만큼 length 프로퍼티만 추가하면 됩니다. 바로 다음과 같이 말이죠.

const arrlike = {
  0: 1,
  1: 2,
  2: 3,
  3: 4,
  4: 5,
  length: 5,
};

for (let i = 0; i < arrlike.length; i++) {
  // 1 2 3 4 5
  console.log(arrlike[i]);
}

몇 안 되는 프로퍼티만으로 유사 배열 객체를 만들어 봤는데 어떤가요? 정말 간단하죠? 이처럼 유사 배열 객체는 for문을 통해 요소를 순회할 수 있습니다. 하지만 for-of와 비구조화 할당, 그리고 전개 연산자(...) 등은 사용할 수 없습니다. 이는 객체가 이터러블(Iterable)하지 않기 때문인데, 이터레이션 프로토콜을 준수하여 객체를 만들어 주면 유사 배열 객체이지만 앞서 언급한 연산을 모두 사용할 수 있습니다.

이터레이션 프로토콜이란 순회 가능한 자료구조를 만들기 위한 규칙을 정의한 것입니다. 👏

이터러블한 객체 만들기

이터러블한 객체를 만들기 위해서는 이터레이션 프로토콜에 따라 객체 내부에 몇 가지 작업을 해야 합니다. 가장 먼저 [Symbol.iterator]라는 심볼명을 가진 메소드를 정의하고, 이 안에서 이터레이터(Iterator)를 반환해야 합니다. 이터레이터는 객체 내부에 상주하며, 현재 어느 지점을 참조 중인지 알려주는 포인터 역할을 합니다. 또한 next라는 이름의 메소드도 정의해야 하는데, 이 메소드는 반복할 요소가 남아있는지에 대한 유무를 체크해서 결과를 객체 형태로 반환합니다.

말만 거창하지 별로 어렵지 않으니 이어지는 코드를 확인하시기 바랍니다.

const arrlike = {
  [Symbol.iterator]() {
    this.i = 0;
    return this;
  },
  next() {
    return { value: this[this.i], done: ++this.i > this.length };
  },
  0: 1,
  1: 2,
  2: 3,
  3: 4,
  4: 5,
  length: 5,
};

for (const value of arrlike) {
  console.log(value); // 1 2 3 4 5
}

const [a, b] = arrlike;
console.log(a, b); // 1 2

console.log(...arrlike); // 1 2 3 4 5

next 메소드는 순회 정보를 value와 done을 가진 객체에 담아 반환해야 합니다. 각 프로퍼티는 현재 참조 중인 값과 더 순회 가능한지에 대한 값을 갖습니다. for-of와 같은 순회 관련 문법은 계속해서 next 메소드를 호출하게 되고, done이 true가 될 때 순회를 종료합니다.

흔히 접하게 되는 유사 배열 객체

자바스크립트로 코딩을 하다 보면 생각보다 자주 유사 배열 객체를 만나게 됩니다.

  • 문자열(string)
  • 함수의 매개변수 객체(arguments)
  • 각종 DOM 객체(HTMLCollection, NodeList 등)
const text = '안녕하세요!';
for (let i = 0; i < text.length; i++) {
  // 안 녕 하 세 요 !
  console.log(text[i]);
}

function foo() {
  // [Arguments] { '0': 'hello', '1': 'jerry', '2': 123 }
  console.log(arguments);
}
foo('hello', 'jerry', 123);

문자열은 원시형 데이터이지만, 객체처럼 접근하여 length 프로퍼티를 확인할 수 있습니다. 원시형 데이터를 객체처럼 사용할 수 있도록 임시 변환하는 작업을 박싱(Boxing)이라 하는데, 이렇게 변환된 문자열 객체도 유사 배열 객체이기 때문에 순회 가능합니다. 웹사이트 개발을 하다 보면 언급한 것들보다 훨씬 더 많은 유사 배열 객체를 만나볼 수 있습니다.

그렇기 때문에 자유롭게 활용할 수 있도록 익숙해질 필요가 있습니다. 😆

References

  • What is Array Like Object in JavaScript
  • Iteration protocols (MDN)
저작자표시 비영리 동일조건 (새창열림)

'🌈 기술스택 > JavaScript' 카테고리의 다른 글

자기 자신을 가리키는 값 this  (0) 2021.10.03
자바스크립트 코드의 유효 범위 Scope  (0) 2021.10.03
얕은 복사 & 깊은 복사  (0) 2021.10.03
일급 객체 (First Class Object)  (0) 2021.10.02
호이스팅 (Hoisting)  (0) 2021.10.01

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • 자바스크립트 코드의 유효 범위 Scope

    자바스크립트 코드의 유효 범위 Scope

    2021.10.03
  • 얕은 복사 & 깊은 복사

    얕은 복사 & 깊은 복사

    2021.10.03
  • 일급 객체 (First Class Object)

    일급 객체 (First Class Object)

    2021.10.02
  • 호이스팅 (Hoisting)

    호이스팅 (Hoisting)

    2021.10.01
다른 글 더 둘러보기

정보

lucid_dream 블로그의 첫 페이지로 이동

lucid_dream

  • lucid_dream의 첫 페이지로 이동

검색

메뉴

  • All categories
  • About me
  • Guest Book

카테고리

  • 분류 전체보기 (122)
    • 💦 일상뻘글 (1)
    • ⭐️ 프로젝트 (7)
      • 사이드 프로젝트 (1)
      • 스터디 노트 (6)
    • 🌈 기술스택 (31)
      • Web Basic (10)
      • JavaScript (14)
      • React (0)
      • Git (7)
    • 💻 컴퓨터공학 (28)
      • 자료구조 (13)
      • 알고리즘 (7)
      • 운영체제 (4)
      • 소프트웨어 공학 (4)
    • 📝 문제풀이 (55)
      • 프로그래머스 (55)
      • 과제관 (0)
    • 🐹 취미생활 (0)
      • Film Log (0)
      • Cover Song (0)

댓글

정보

NoHack의 lucid_dream

lucid_dream

NoHack

나의 외부 링크

  • Github
  • Instagram

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. Copyright © NoHack.

티스토리툴바