Program Tip

객체 배열에서 잘못된 자바 스크립트 배열 길이

programtip 2020. 12. 15. 19:44
반응형

객체 배열에서 잘못된 자바 스크립트 배열 길이


누군가이 (이상한) 행동을 설명 할 수 있습니까? 첫 번째 예의 길이가 2가 아니라 왜 3이고, 가장 중요한 것은 두 번째 예의 길이가 0 인 이유는 무엇입니까? 키가 숫자이면 길이가 작동합니다. 그렇지 않은 경우 길이는 0입니다. 두 번째 예에서 올바른 길이를 어떻게 얻을 수 있습니까? 감사합니다.

a = [];
a["1"] = {"string1":"string","string2":"string"};
a["2"] = {"string1":"string","string2":"string"};
alert(a.length); // returns 3

b = [];
b["key1"] = {"string1":"string","string2":"string"};
b["key2"] = {"string1":"string","string2":"string"};
alert(b.length); // returns 0

한 가지주의 할 점은 일반 배열과 연관 배열간에 차이가 있다는 것입니다. 일반 배열 (실제 배열)에서 인덱스는 정수 여야합니다. 반면, 연관 배열은 문자열을 인덱스로 사용할 수 있습니다. 원하는 경우 연관 배열을 맵으로 생각할 수 있습니다. 이제 실제 배열은 항상 0부터 시작합니다. 따라서 예제에서는 다음과 같은 방식으로 배열을 만들었습니다.

a = [];
a["1"] = {"string1":"string","string2":"string"};
a["2"] = {"string1":"string","string2":"string"}

Javascript는 문자열 인덱스를 숫자로 변환 할 수 있으므로 위의 코드는 다음과 같습니다.

a = [];
a[1] = {"blah"};
a[2] = {"blah"};

그러나 앞서 말한 것을 기억하십시오. 진정한 배열은 0에서 시작합니다. 따라서 자바 스크립트 인터프리터는 undefined에 자동으로 a [0]을 할당합니다. 방화범이나 크롬 / 사파리 콘솔에서 시도해보십시오. "a"를 인쇄하려고 할 때 이와 같은 내용이 표시됩니다. "[undefined, Object, Object]와 같은 메시지가 표시됩니다. 따라서 예상 한대로 크기가 2가 아니라 3입니다.

두 번째 예에서는 본질적으로 객체에 속성을 추가하는 관련 배열의 사용을 시뮬레이션하려고 시도하고 있다고 확신합니다. 연관된 배열을 사용하면 문자열을 키로 사용할 수 있습니다. 즉, 객체에 속성을 추가하는 것입니다. 따라서 귀하의 예에서 :

b["key1"] = {"string1":"string","string2":"string"};

이것은 정말로 의미합니다 :

b.key1 = {"string1":"string","string2":"string"};

초기화 b = []는 단순히 배열을 생성하지만 할당은 배열을 채우지 않습니다. 단순히 "b"추가 속성을 제공합니다. 도움이 되었기를 바랍니다.. :-)


길이는 1 + 객체에서 가장 큰 정수 키를 반환합니다.

에서 a가장 큰 키 (3)는 2 2 + 1 그렇다.

에서 b더 정수 키가없는 (키가있다 key1하고 key2있는이의 int로 변환 할 수 없습니다) 자바 스크립트가 가장 큰 키가 있다고 가정 있도록 -1하고, 1 + -1수율 0.

이 프로그램은 다음 사항을 확인하는 데 도움이됩니다.

a = [];
a["1"] = {};
a["4"] = {};
alert(a.length); // Prints 5

ECMAScript 표준, ECMA-262, 5th ed.

15.4.5.2 길이

이 Array 객체의 길이 속성은 값이 항상 배열 인덱스 인 삭제 가능한 모든 속성의 이름보다 숫자 적으로 큰 데이터 속성입니다.

배열의 길이 속성은 정수인 배열 인덱스 만 고려합니다. 다른 속성을 설정해도 길이에 영향을주지 않습니다.

배열의 경우 a["3"]는 다음과 같습니다 a[3](이 동작은 § 15.4.5.1에서 지정됨). 3은 속성이 아닌 배열 인덱스입니다. 따라서 설정 a["3"]은 어레이의 길이에 영향을줍니다. b["key1"]와 동일합니다 b.key1. 속성 설정은 컬렉션의 길이에 영향을주지 않습니다.

참조 URL : https://stackoverflow.com/questions/2528680/javascript-array-length-incorrect-on-array-of-objects

반응형