문제

즉, 현재 시간을 배열의 인덱스로 사용하는 경우:

array[Date.getTime()] = value;

인터프리터가 0부터 지금까지의 모든 요소를 ​​인스턴스화합니까?브라우저마다 다르게 작동합니까?

예전에 버그가 있었던걸로 기억하는데 AIX 요청 시 의사 tty를 생성하는 커널이지만 "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 ...안에 ..." 구문을 사용하면 모두 잡을 수 있습니다.

var sparse = {}; // not []
sparse["whatever"] = "something";

Javascript 객체는 희박하며 배열은 자동으로 유지되는 길이 속성(실제로는 가장 큰 인덱스보다 하나 더 큰)을 가진 특수 객체일 뿐입니다. ~ 아니다 정의된 요소의 수) 및 몇 가지 추가 방법.어느 쪽이든 안전합니다.추가 기능이 필요하면 배열을 사용하고, 그렇지 않으면 객체를 사용하세요.

JavaScript에서 일반적으로 그렇듯이 대답은 "조금 더 이상합니다..."입니다.

메모리 사용량은 정의되지 않았으며 모든 구현은 어리석은 것이 허용됩니다.이론에 의하면, const a = []; a[1000000]=0; 메가바이트의 메모리를 소모할 수 있습니다. const a = [];.실제로 Microsoft조차도 이러한 구현을 피합니다.

저스틴 러브 지적하자면, 길이 속성은 제일 높은 인덱스 세트.그러나 인덱스가 정수인 경우에만 업데이트됩니다.

따라서 배열이 희박합니다.하지만 Reduce(), Math.max() 및 "for ...와 같은 내장 함수는 다음과 같습니다.of"는 0에서 길이까지 가능한 정수 인덱스의 전체 범위를 탐색하여 '정의되지 않음'을 반환하는 많은 항목을 방문합니다.이 아니라면 ...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

하지만.아직 언급되지 않은 배열과 관련된 더 많은 특수 사례가 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top