2012-04-21 1 views
4

내 질문 Node.js에서 JavaScript/ECMAScript 배열이 "드문 드문"입니까?

자바 스크립트 배열 스파 스 ... 한 차이 Are Javascript arrays sparse?와 동일 Node.js를 (및/또는 V8)에서 구현? 나는 그랬지만, 다음과 같은 테스트를했다.

var testArray = []; 
testArray[10000] = 'test'; 
console.log(testArray); 

반환되는 값은 10,000이며, 끝에 'test'가있다. 이것은 디버깅 출력이 작동하는 방식 때문입니까, 아니면 Node.js가 새로운 요소를 추가 할 때 실제로 정의되지 않은 배열 요소에 대해 메모리를 할당합니까?

+1

콘솔이 언어의 일부가 아닙니다. 콘솔이 무언가를 표현하기로 결정하는 방법은 실제로 그 것에 영향을 미치지 않습니다. –

+0

@ amnotiam, 그게 내 질문은 콘솔의 출력물이 콘솔의 포맷팅인지 아니면 객체가 실제로 저장된 방식인지에 관한 질문 인 이유를 깨닫는다. Dennis는 그 질문에 대답했습니다. – Brad

답변

2

노드의 util.inspect 함수는 드문 드문 한 배열을 검사하여 이와 같이 인쇄합니다. 사실 a test that specifically checks for it입니다. 노드 감찰관을 완전히 다시 작성했기 때문에 궁극적으로 핵심 노드가되지 않아서 UltraREPL이됩니다.

+0

멋진 도구! 나는 그것을 확실히 다운로드 할 것이다. 그리고 귀하의 답변과 단위 테스트에 대한 참조에 감사드립니다. – Brad

5

표시되는 내용은 실제 배열이 아니며 단지 표현입니다. 콘솔에서는 lengthsplice 속성이 있는지 확인하고 개체의 숫자 속성을 인쇄하므로 기록 될 때 jQuery 컬렉션이 배열로 표시됩니다.

function RandomThingThatIsDefinitelyNotAnArray() { 
    this.splice = function() {}; 
    this.length = 10; 
    this[5] = 5; 
} 

console.log(new RandomThingThatIsDefinitelyNotAnArray());​ 
// shows [undefined, undefined, undefined, undefined, undefined, 5] 

jsfFiddle 라이브 데모 용입니다.

+0

+1 더 알고 싶습니다. 왜 객체 대신 배열과 같은 구조를 반환하는지에 대한 언급이 있습니까? 길이와 스플 라이스는 배열과 같은 구조를 만드는 데 필요한 유일한 것입니까? – Joseph

+1

구조는 실제로 내부적으로 다르지 않습니다. 콘솔은 다르게 표시합니다. [isArray 검색] (http://fbug.googlecode.com/svn/lite/branches/firebug1.4/build/firebug-lite-debug.js) 콘솔에 관한 한 Array와 같은 자격 요건을 확인하십시오. 걱정. 그것은 방화범 코드이지만, Chrome은 동일한 기준을 사용합니다. – Dennis