2012-02-10 1 views
18

자바 스크립트 ArrayObject의 차이는 그리 크지 않습니다. 사실은 Array 주로 length 필드를 추가 것 같다, 그래서 당신은 숫자 배열로 모두 Array들과 Object의를 사용할 수 있습니다 인기있는 자바 스크립트 엔진에서javascript 배열 실제로 배열로 구현되어 있습니까?

var ar = new Array(); 
ar[0] = "foo"; 
ar["bar"] = "foo"; 

var ob = new Object(); 
ob[0] = "foo"; 
ob["bar"] = "foo"; 

assert(ar[0] == ob[0] == ar["0"] == ob["0"] == ar.bar == ob.bar); // Should be true. 

그래서 내 질문입니다, (V8, JavaScriptCore는, SpiderMonkey를, 등), 어떻게 처리됩니까? 분명히 우리는 배열이 실제로 키 값을 가진 해시 맵으로 저장되기를 원하지 않습니다! 데이터가 실제 배열로 저장되는 것이 합리적이라고 어떻게 확신 할 수 있습니까?

는 지금까지 몇 가지 방법이 있습니다 내가 볼 수있는 엔진이 걸릴 수 :

  1. ArrayObject과 정확히 같은 방식으로 구현 - 문자열 키 연관 배열한다.
  2. Array
  3. Object과 동일한 숫자 키를 백업 std::vector -like 배열, 당신은 ar[100000000] = 0;
  4. Array을한다면 미친 메모리 사용을 방지하기 위해 일부 밀도 발견으로, 특별한 경우, 모든 객체는 휴리스틱을 얻을 배열을 사용하는 것이 더 합리적인지 확인하십시오.
  5. 내가 생각하지 못한 미친 짓은 뭔가 복잡합니다. 적절한 배열 형 (기침 WebGL을 입력 배열 기침)이 있다면

은 정말 간단하다.

+2

[기사] (http://news.qooxdoo.org/javascript-array-performance-oddities-characteristics)는 약간 오래된 것으로 구현을 명시 적으로 설명하지 않습니다. 그러나 상세한 성능 측정을 수행하고 가능한 구현을 유추합니다. –

+2

배열은 '길이'속성이 적용된 _just_지도가 아닙니다. 그렇다면, 시프 팅 또는 시프 팅하지 않으면 인덱싱이 깨질 수 있습니다 (즉,배열에서 값을 시프트하고 여전히 인덱스 0에서 시작하고 1에서 시작하지 않습니다. 그래서 적어도 조금 더 진행되고 있습니다. (이것은 반드시 구현에 대해 아무 것도 말하지 않는다.) – Flambino

+1

왜'r [0] == ob [0] == ar [ "0"] == ob [ "0"] == ar일까요? bar == ob.bar'이 맞습니까? ''a '=='a '=='a ''는 false로 평가되는'true =='a''를 평가하기 때문에 false입니다. –

답변

12

SpiderMonkey에서 배열은 기본적으로 jsvals의 C 배열로 구현됩니다. 이들은 "조밀 한 배열"이라고합니다. 그러나 객체와 같이 처리하는 것과 같이 객체에 배열되지 않은 작업을 시작하면 구현이 객체와 매우 유사한 것으로 변경됩니다.

이야기의 도덕 : 배열을 원할 때 배열을 사용하십시오. 객체를 원할 때는 객체를 사용하십시오.

오, jsval은 64 비트 C 유형에서 가능한 모든 JavaScript 값을 나타낼 수있는 일종의 가변 유형입니다.

6

V8 및 Carakan (및 아마도 Chakra)에서 이름이 배열 색인 (ES5에 정의 된대로) 인 등록 정보를 가진 모든 (비 호스트) 객체 (배열 및 비 호스트 모두)는 다음과 같이 저장됩니다. 조밀 한 배열 (값 래퍼를 포함하는 C 배열) 또는 희소 배열 (이진 검색 트리로 구현 됨).

통일 된 개체 표현은 열거 순서에 영향을줍니다. 개체를 사용하면 SpiderMonkey와 SquirrelFish가 둘 다 모든 속성을 삽입 순서로 제공합니다. 그리고 배열과 함께, 그들은 일반적으로 (적어도 SM의 특수한 경우가 있습니다!) 배열 인덱스는 먼저 모든 다른 속성을 삽입 순서로 사용합니다. V8, Carakan 및 Chakra는 항상 개체 인덱스 유형에 관계없이 항상 배열 인덱스를 제공하고 다른 모든 속성은 삽입 순서로 제공합니다.