>  기사  >  웹 프론트엔드  >  JavaScript_javascript 기술의 배열 유사 객체

JavaScript_javascript 기술의 배열 유사 객체

WBOY
WBOY원래의
2016-05-16 16:05:201138검색

저는 오래 전에 인수가 배열([].slice.call(arguments))로 변환될 수 있다는 것을 알고 있었습니다.
인수는 배열과 유사한 객체이므로 다음과 같이 사용할 수 있습니다. 하지만 저는 배열과 유사한 객체가 무엇인지 명확하게 알지 못했습니다

오늘 Effective JavaScript를 읽었을 때 이에 대한 전용 섹션이 있었는데 정말 기분이 좋았습니다.

먼저 제가 작성한 샘플 코드를 살펴보세요.

코드 복사 코드는 다음과 같습니다.

a = "안녕하세요"
[].map.call(a, (e) -> e.toUpperCase()) # => [ 'H', 'E', 'L', 'L', 'O' ]
[].reduceRight.call(a, (acc, e) -> acc e) # => 'olleh'
b = {1: "a", 2: "b", 4: "c", 길이: 6}
[].reduce.call(b, (acc, e) -> acc e) # => 'abc'

첫 번째는 문자열에 대해 작동합니다. 문자열도 배열과 유사한 객체로 간주될 수 있습니다. 하지만 뒤에 있는 b 객체는 실제로
또한 배열과 유사한 객체이기도 합니다.

책의 설명 읽기:

코드 복사 코드는 다음과 같습니다.

그렇다면
의 기본 계약이 정확히 무엇이 객체를 "배열과 유사"하게 만드는 걸까요? 배열 객체는 두 가지 간단한 규칙에 해당합니다.
0~2^32 – 1 범위의 정수 길이 속성을 가집니다.
길이 속성이 객체의 가장 큰 인덱스보다 큽니다.
인덱스는 문자열 표현이 있는 0~2^32 – 2 범위의 정수입니다
객체 속성의 키입니다.

단순한 규칙은 이 두 가지뿐입니다.

그럼 위의 인수, 문자열, b 객체는 왜 배열형 객체로 간주될 수 있을까요?

모두 유효한 길이 속성(0에서 2**32 - 1 사이의 양의 정수)을 갖습니다.
길이 속성의 값이 최대 인덱스보다 큽니다.
또 다른 예:

코드 복사 코드는 다음과 같습니다.

b = {1: "a", 2: "b", 4: "c", 길이: 3}
[].reduce.call(b, (acc, e) -> acc e) # => 'ab'

글쎄, 틀렸습니다. 규칙 2를 위반했기 때문에 'ab'가 되었습니다. 길이 속성은 3입니다.
최대 인덱스 값은 length 속성보다 큰 4입니다. 그래서 행동이 이상해요.

이 인터페이스만 정의하면 배열의 모든 메소드를 사용할 수 있다는 것은 너무 강력한 것 같습니다.

사실 모든 메소드를 사용할 수 있는 것은 아닙니다. Array.prototype.concat
두 개의 어레이를 연결하기 때문에 사용할 수 없습니다. 어레이 담당자가 아니면 절대 사용할 수 없습니다.

또 다른 작은 문제는 문자열이 생성된 후에는 변경 불가능하므로 어떻게 던져도 변경 불가능한 상태로 유지된다는 것입니다.

그러나 이 책에서는 이 두 가지 조건을 충족하면 왜 배열형 객체로 간주될 수 있는지 전혀 설명하지 않습니다. 게다가 이 책의 저자는
그는 ECMAScript 위원회의 회원이므로 기본적으로는 신뢰할 수 있습니다. 이 두 가지 조건을 충족하면 왜 배열형 객체로 간주될 수 있는지에 대해서는 오랫동안 Google에서 검색했지만 합리적인 설명을 찾지 못했습니다.

위 내용은 이 글의 전체 내용입니다. 모두 마음에 드셨으면 좋겠습니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.