2009-10-02 2 views
81

즉, 현재 시간을 배열의 인덱스로 사용하면Javascript 배열이 희소합니까?

array[Date.getTime()] = value; 

해석기가 0부터 현재까지 모든 요소를 ​​인스턴스화합니까? 다른 브라우저가 다르게합니까?

AIX 커널에는 요청시 pseudo-ttys를 생성하는 버그가있었습니다 만, "echo>/dev/pty10000000000"라고 말하면/dev/pty0을 생성하고,/dev/pty1, .... 그리고 죽은 상태로 넘어집니다. 무역 박람회에서 재미 있었지만 내 고객에게 이런 일이 일어나기를 바라지 않습니다.

+0

당신은 그냥 그것을 밖으로 시도하고 충돌 볼 왜. –

+0

@NickLarsen : http://jsbin.com/okuze <- no crash ... ;-) – Shog9

+1

이렇게하는 것의 단점은 파이어 버그에서의 디버깅의 어려움입니다. 배열의 log 문은 배열의 처음 1000 개 요소 만 나열합니다.이 요소는 모두 "정의되지 않음"입니다. 또한 array.length는 n-1이 정의되지 않은 "유령"일지라도 배열에 n 개의 요소가 있음을 알려줍니다. –

답변

33

JavaScript 배열을 구현하는 방법은 브라우저마다 다르지만 일반적으로 실제 배열을 사용하면 비효율적 인 경우 일반적으로 일반 객체의 속성 액세스에 사용되는 동일한 스파 스 구현으로 대체됩니다.

특정 구현에 대해 더 많은 지식을 가진 사람에게 조밀 한 것에서 드문 드문하게 전환하는 것을 자극하는 것에 응답해야합니다.하지만 예제는 완벽하게 안전해야합니다. 조밀 한 배열을 원한다면, 명시적인 길이의 인자를 가진 생성자를 호출해야하며 실제로 하나를 얻을 수 있기를 바랍니다.

olliej에 대한 자세한 설명은 this answer을 참조하십시오.

+0

'foo = new Array와 같이 말하면 실제로 배열이 고밀도라고 생각하지 않습니다. (10000)'이다. 그러나, 이것은 작동해야합니다 :'foo = Array.apply (null, {length : 10});'. 언어 관점에서 볼 때 – Taurus

56

예, 있습니다. 실제로 내부적으로 해시 테이블이므로 큰 정수뿐만 아니라 문자열, 부동 소수점 또는 다른 객체를 사용할 수 있습니다. 모든 키는 해시에 추가되기 전에 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> 

디스플레이 : 난 단지 당신에게 실제로 정의 된 인덱스를 제공 for...in 구문을 사용하는 방법

array[0] = zero, typeof(0) == string 
array[1254503972355] = now, typeof(1254503972355) == string 
array[3.14] = pi, typeof(3.14) == string 

알 수 있습니다. 좀 더 일반적인 for (var i = 0; i < array.length; ++i) 스타일을 사용한다면 비표준 배열 인덱스에 문제가있을 것입니다.

+0

배열은 일반적인 "속성"메커니즘에 인덱스/값을 저장하는 일반 JS 객체입니까? 이것이 귀하의 코드가 제안하는 것입니다. 그런 다음 JS 배열에는 오브젝트 케이크를 장식하는 것과 같은 몇 가지 추가 프로토 타입 메소드가 있다는 것을 알았겠습니까? – Matt

+5

대부분의 JS 구현은 가능한 경우 실제 배열에 숫자로 인덱싱 된 속성을 저장합니다. 그것은 언어의 관점에서 볼 때 마법의 '길이'속성을 가진 정규 객체입니다. – Christoph

+0

'for ... in'구문에 'length'와 같은 것을 숨기는 마법도 있습니다. 배열의 속성이나 메소드가 아닌 배열 인덱스를 반복합니다. 사람들이 가지고있는 한가지 공통적 인 문제는'Object.prototype' 또는'Array.prototype'에 물건을 추가하는 것입니다. 그런 다음 추가 된 속성/메소드가 숨겨지지 않으므로 for ... in 루프를 모두 끊습니다. –

7

자바 스크립트 객체는 희소하고 배열은 길이가 자동으로 유지되는 속성 (실제로는 최대 색인 인 이 아니며 정의 된 요소의 수인이 아님)과 몇 가지 추가 메소드가있는 특수 객체입니다. 당신은 어느쪽으로 든 안전합니다; 추가 기능이 필요하면 배열을 사용하고, 그렇지 않으면 객체를 사용하십시오.

+3

; 구현은 실제로 실제 배열을 사용하여 밀집한 숫자 속성을 저장합니다. – Christoph

8

이런 종류의 작업을 위해 설계된 자바 스크립트 구문을 사용하면이 문제를 피할 수 있습니다. 사전으로 취급 할 수 있지만 "for ... in ..."구문을 사용하면 모두 가져올 수 있습니다. 일반적으로

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

은 자바 스크립트의 배열은 드문 드문 있지만, 우리는 그들이 조밀 할뿐만 아니라 수 있습니다

여분 배열 :

var a = new Array(3); 
> a 
[ , , ] 
> a.length 
3 
> a[0] 
undefined 
+0

이 답변의 서식이 다소 혼란스러워서 사용자가 의미하는 바를 따르기 어렵습니다. 그걸 수정해도 될까요? – ivanreese

+1

하지만 예제의 배열은 "드문 드문"이 아닙니다. – Taurus

-6

당신은 HTML5 로컬 스토리지 또는 sessionStorage를 사용할 수 있습니다.

var date=Date.getTime(),value='1234567890'; 
date=date.toString(); 
localStorage.setItem(date, value); 

* sessionStorage 개체는 하나의 세션에 대한 데이터 만 저장한다는 점을 제외하고는 localStorage 개체와 같습니다. 사용자가 특정 브라우저 탭을 닫으면 데이터가 삭제됩니다. 더 많은 것을 알고 싶습니다 w3schools.com

+2

질문 : "자바 스크립트 배열이 희박합니까?" 답변 : "HTML5 localStorage 또는 sessionStorage를 사용할 수 있습니다." 음, 뭐야?!?!?!?! –