저는 오래 전에 인수가 배열([].slice.call(arguments))로 변환될 수 있다는 것을 알고 있었습니다.
인수는 배열과 유사한 객체이므로 다음과 같이 사용할 수 있습니다. 하지만 저는 배열과 유사한 객체가 무엇인지 명확하게 알지 못했습니다
오늘 Effective JavaScript를 읽었을 때 이에 대한 전용 섹션이 있었는데 정말 기분이 좋았습니다.
먼저 제가 작성한 샘플 코드를 살펴보세요.
첫 번째는 문자열에 대해 작동합니다. 문자열도 배열과 유사한 객체로 간주될 수 있습니다. 하지만 뒤에 있는 b 객체는 실제로
또한 배열과 유사한 객체이기도 합니다.
책의 설명 읽기:
단순한 규칙은 이 두 가지뿐입니다.
그럼 위의 인수, 문자열, b 객체는 왜 배열형 객체로 간주될 수 있을까요?
모두 유효한 길이 속성(0에서 2**32 - 1 사이의 양의 정수)을 갖습니다.
길이 속성의 값이 최대 인덱스보다 큽니다.
또 다른 예:
글쎄, 틀렸습니다. 규칙 2를 위반했기 때문에 'ab'가 되었습니다. 길이 속성은 3입니다.
최대 인덱스 값은 length 속성보다 큰 4입니다. 그래서 행동이 이상해요.
이 인터페이스만 정의하면 배열의 모든 메소드를 사용할 수 있다는 것은 너무 강력한 것 같습니다.
사실 모든 메소드를 사용할 수 있는 것은 아닙니다. Array.prototype.concat
두 개의 어레이를 연결하기 때문에 사용할 수 없습니다. 어레이 담당자가 아니면 절대 사용할 수 없습니다.
또 다른 작은 문제는 문자열이 생성된 후에는 변경 불가능하므로 어떻게 던져도 변경 불가능한 상태로 유지된다는 것입니다.
그러나 이 책에서는 이 두 가지 조건을 충족하면 왜 배열형 객체로 간주될 수 있는지 전혀 설명하지 않습니다. 게다가 이 책의 저자는
그는 ECMAScript 위원회의 회원이므로 기본적으로는 신뢰할 수 있습니다. 이 두 가지 조건을 충족하면 왜 배열형 객체로 간주될 수 있는지에 대해서는 오랫동안 Google에서 검색했지만 합리적인 설명을 찾지 못했습니다.
위 내용은 이 글의 전체 내용입니다. 모두 마음에 드셨으면 좋겠습니다.