2012-04-21 3 views
4

私の質問1差のAre Javascript arrays sparse?と同じであるNode.jsの(および/またはV8)で実装されている...Node.jsのJavaScript/ECMAScript配列は「スパース」ですか?

がまばらなJavaScriptの配列、です?私はそれを前提としていましたが、次に次のテストを行いました:

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

返されるのは空白の要素で、最後に「テスト」があります。これはデバッグ出力の仕組みのためか、Node.jsは新しい要素を追加するときに未定義の配列要素に実際にメモリを割り当てますか?

+1

コンソールは言語の一部ではありません。コンソールが何かを表現することを決定する方法は、実際にそのことが何であるかに影響を与えません。 –

+0

@ amnotiam、私はそれが私の質問は、私が見ていたコンソールの出力がコンソールのフォーマット、またはオブジェクトが実際に格納された方法によるものかどうかということです。デニスはその質問に答えました。 – 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もっと知りたいです。オブジェクトの代わりに配列のような構造体を返す理由についての参考資料がありますか? 'length'と' splice'は配列のような配列のような構造を作るために必要なものだけですか? – Joseph

+1

構造は実際には内部的に違いはなく、コンソールはそれを別の方法で表示します。 [isArrayを検索する](http://fbug.googlecode.com/svn/lite/branches/firebug1.4/build/firebug-lite-debug.js)、コンソールのようにArray-likeの資格を確認してください心配している。それはFirebugのコードですが、私の知る限り、Chromeは同じ基準を使用しています。 – Dennis