Javascript 배열이 희소합니까?
즉, 현재 시간을 배열의 인덱스로 사용하는 경우 :
array[Date.getTime()] = value;
인터프리터는 0부터 지금까지 모든 요소를 인스턴스화합니까? 브라우저마다 다르게 작동합니까?
요청에 따라 의사 -ttys를 생성 하는 AIX 커널에 버그가 있었던 것을 기억합니다 . 그러나 "echo> / dev / pty10000000000"이라고 말하면 / dev / pty0, / dev / pty1이 생성됩니다. .... 그리고 죽어 넘어집니다. 무역 박람회에서는 재미 있었지만 고객에게 이런 일이 일어나지 않기를 바랍니다.
JavaScript 배열이 정확히 구현되는 방식은 브라우저마다 다르지만 일반적으로 실제 배열을 사용하는 것이 비효율적이면 일반 객체의 속성 액세스에 사용되는 것과 동일한 희소 구현으로 대체됩니다.
특정 구현에 대해 더 많은 지식을 가진 사람에게 조밀에서 희소로의 전환을 유발하는 원인에 대한 답변을 요청해야하지만 예제는 완벽하게 안전해야합니다. 조밀 한 배열을 얻으려면 명시적인 길이 인수를 사용하여 생성자를 호출하고 실제로 하나를 얻길 바랍니다.
olliej의 자세한 설명 은 이 답변 을 참조하십시오 .
네, 그렇습니다. 실제로 내부적으로는 해시 테이블이므로 큰 정수뿐만 아니라 문자열, 부동 소수점 또는 기타 개체도 사용할 수 있습니다. 모든 키 toString()
는 해시에 추가되기 전에을 통해 문자열로 변환됩니다 . 몇 가지 테스트 코드로이를 확인할 수 있습니다.
<script>
var array = [];
array[0] = "zero";
array[new Date().getTime()] = "now";
array[3.14] = "pi";
for (var i in array) {
alert("array["+i+"] = " + array[i] + ", typeof("+i+") == " + typeof(i));
}
</script>
표시 :
array[0] = zero, typeof(0) == string
array[1254503972355] = now, typeof(1254503972355) == string
array[3.14] = pi, typeof(3.14) == string
for...in
실제로 정의 된 인덱스 만 제공 하는 구문을 어떻게 사용했는지 주목하십시오 . 더 일반적인 for (var i = 0; i < array.length; ++i)
반복 스타일 을 사용하면 비표준 배열 인덱스에 분명히 문제가 있습니다.
이런 종류의 것을 위해 설계된 자바 스크립트 구문을 사용하여 문제를 피할 수 있습니다. 사전으로 취급 할 수 있지만 "for ... in ..."구문을 사용하면 모든 것을 얻을 수 있습니다.
var sparse = {}; // not []
sparse["whatever"] = "something";
자바 스크립트 객체는 희소하고 배열은 자동 유지되는 길이 속성 (실제로 는 정의 된 요소 수가 아니라 가장 큰 인덱스보다 하나 더 큼 )과 몇 가지 추가 메서드 가있는 특수 객체입니다 . 당신은 어느 쪽이든 안전합니다. 추가 기능이 필요한 경우 배열을 사용하고 그렇지 않으면 객체를 사용하십시오.
대답은 일반적으로 JavaScript에서 그렇듯이 "조금 더 현명합니다 ...."입니다.
메모리 사용량은 정의되지 않았으며 모든 구현은 어리석은 것이 허용됩니다. 이론적으로 const a = []; a[1000000]=0;
는 메가 바이트의 메모리를 태울 수 const a = [];
있습니다. 실제로 Microsoft조차도 이러한 구현을 피합니다.
Justin Love 는 길이 속성이 가장 높은 인덱스 세트라고 지적합니다 . 그러나 인덱스가 정수인 경우에만 업데이트됩니다.
따라서 배열은 희소합니다. 그러나 reduce (), Math.max () 및 "for ... of"와 같은 내장 함수는 0에서 길이까지 가능한 정수 인덱스의 전체 범위를 살펴보고 'undefined'를 반환하는 많은 항목을 방문합니다. 그러나 'for ... in'루프는 정의 된 키만 방문하여 예상대로 수행 할 수 있습니다.
다음은 Node.js를 사용하는 예입니다.
"use strict";
const print = console.log;
let a = [0, 10];
// a[2] and a[3] skipped
a[4] = 40;
a[5] = undefined; // which counts towards setting the length
a[31.4] = 'ten pi'; // doesn't count towards setting the length
a['pi'] = 3.14;
print(`a.length= :${a.length}:, a = :${a}:`);
print(`Math.max(...a) = :${Math.max(a)}: because of 'undefined values'`);
for (let v of a) print(`v of a; v=:${v}:`);
for (let i in a) print(`i in a; i=:${i}: a[i]=${a[i]}`);
기부:
a.length= :6:, a = :0,10,,,40,:
Math.max(...a) = :NaN: because of 'undefined values'
v of a; v=:0:
v of a; v=:10:
v of a; v=:undefined:
v of a; v=:undefined:
v of a; v=:40:
v of a; v=:undefined:
i in a; i=:0: a[i]=0
i in a; i=:1: a[i]=10
i in a; i=:4: a[i]=40
i in a; i=:5: a[i]=undefined
i in a; i=:31.4: a[i]=ten pi
i in a; i=:pi: a[i]=3.14
But. There are more corner cases with Arrays not yet mentioned.
참고URL : https://stackoverflow.com/questions/1510778/are-javascript-arrays-sparse
'programing tip' 카테고리의 다른 글
config / environments / development.rb에서“consider_all_requests_local”의 목적은 무엇입니까? (0) | 2020.09.06 |
---|---|
동적 SQL-EXEC (@SQL) 대 EXEC SP_EXECUTESQL (@SQL) (0) | 2020.09.06 |
IllegalArgumentException은 언제 발생해야합니까? (0) | 2020.09.06 |
Xcode 4에서 인덱싱을 비활성화하는 방법은 무엇입니까? (0) | 2020.09.06 |
템플릿을 사용할 때 "해결되지 않은 외부 기호"오류가 발생하는 이유는 무엇입니까? (0) | 2020.09.06 |