이터러블객체, 유사배열객체

lee jae hwan·2022년 7월 23일

javascript

목록 보기
18/107

이터러블객체 : symbol.iterator 메소드를 가진 객체
유사배열객체 : 인덱스와 length속성을 가진 객체

이터러블객체와 유사배열객체는 독립적이다.

문자열은 배열이 아니고 이터러블객체이면서 유사배열객체이다.



자바스크립트는 문자열 한문자를 utf16(2byte)으로 처리하기때문에 문자열의 length속성은 총바이트/2바이트가 된다.

let str = '𝒳😂';
console.log( Array.isArray(str) ); // false
console.log( str[Symbol.iterator] ); // fn...
console.log( str.length ); // 4
console.log(str[0]); // 깨진글자

써로게이트쌍은 한문자당 4바이트 총 8바이트를 차지하므로 length는 2가 되어야 하는데 출력은 4가 된다.

이것으로보아 str은 문자열을 써로게이트쌍으로 인식하지 않고 일반 문자열로 인식하는 것이다. 어떻게 보면 이것은 당연한 것으로 보이기도 한다.

자바스크립트가 내부적으로 써로게이트쌍을 구현했으면 몰라도 그것까지 구현하지 않았을 것으로 예상되기 때문이다.

문자열은 저장된 데이터가 써로게이트쌍인지 일반 문자열인지 관심이없는 일반적인 유사배열객체다.

따라서 str[0]부터 str[4]까지(2바이트) 인덱스접근이 가능하고 str[0]은 깨진문자가 출력된다.

let str = '𝒳😂';
for (const val of str) {
   console.log( val ); // 𝒳    😂
}

이터레이터는 위 문자열이 써로게이트쌍을 출력한다.
이터레이터는 문자열이 써로게이트쌍임을 알고 2번 반복되도록 구현되어있는 것이다.

let str = '𝒳😂';
let strArr = Array.from(str);
console.log(strArr[0]); // 𝒳

써로게이트쌍 문자열을 배열화후 출력하면 써로게이트쌍문자가 출력된다.

배열인덱스도 제대로 출력하므로 배열은 써로게이트쌍을 완벽히 지원한다.

써로게이트쌍의 처리핵심은 이터러블객체인 것이다.

자바스크립트 문자열은 내부에 써로게이트쌍이 있는지 없는지 관심이 없다. 이터레이터와 배열은 써로게이트쌍이 구현되어 있다.



배열을 제공받는다면 반복순회 및 각종 메소드를 사용할 수 있으므로 편하게 사용하면 된다.

전달객체가 이터러블이라면 반복순회만 가능하기때문에 배열메소드를 사용하려면 배열화해서 사용할 수 밖에 없다.

전달객체가 유사배열(length 필수와 숫자인덱스)객체라면 반복순회를 해야하면 구지 배열화하지 말고 이터러블화해서 사용하면 된다.

유사배열객체로 할수있는것은 인덱스접근과 length속성밖에 없기때문에 위와같이 변형작업이 필요하다.

어떻게 이터러블화하는지와 그외 Array.from, Object.keys, Object.values등 여러가지 방법을 알아볼것이다.

0개의 댓글