2011-08-15 9 views
13

私はJavascriptを使い慣れていないので、配列のサイズを指定する必要はなく、多くの人が動的に1つの要素を動的に作成していることがよく分かります。これは、サイズが大きくなるにつれてアレイのメモリを常に再割り当てする必要があるため、他の言語ではパフォーマンス上の大きな問題になります。JavaScript配列は実際にリンクされたリストですか?

これはJavaScriptでは問題ありませんか?もしそうなら、利用可能なリスト構造がありますか?

+0

サイズ変更可能な配列を持つ言語では、割り当てられた実際のメモリは通常、増加するたびに倍増します。結果として、あなたは常にどんな言語でもメモリを再割り当てするつもりはありません。 –

+0

ありがとう、それは私のためにうまく動作します。私はちょうど私がjavascript faux pasをコミットしていないことを確認したかった。 –

答えて

4

実際には、プロパティをインデックスとして使用するカスタムオブジェクトによく似ています。 例:

var a = { "1": 1, "2": 2}; 
a.length = 2; 
for(var i=0;i<a.length;i++) 
    console.log(a[i]); 

aはほとんど配列のように動作します、そしてあなたもそれにArray.prototypeを関数を呼び出すことができます。

+0

ゼロインデックスを見逃しませんか? – Zlatko

+0

@Eliuが何を表示しようとしているのか分かりません。コードはこのようには決して動作しません(おそらく意図?)。文字列キーは、整数ではなく文字列として参照する必要があります。だから '' 'a [1]' ''は値をもたらさないでしょう。アイテムをリストするための適切なコードは、 '' for .. in''を使用するか、例えば。 '' 'console.log(a [" '+(i + 1)]); '' ' –

3

Javascript配列は、C/C++や他の言語のような真の配列ではありません。したがって、それらは効率的ではありませんが、おそらく使いやすく、範囲外の例外をスローしません。

7

動的言語については、動的であるということがあります。 JavaのArrayListやPerl、PHP、Pythonの配列と同様に、JavaScriptの配列は一定量のメモリを割り当て、大きすぎると自動的にオブジェクトに追加されます。 C++やJavaと同じくらい効率的ですか?いいえ(C++はJSの最善の実装であってもサークルを走らせることができます)、人々はJSで(まだ)まだQuakeをビルドしていません。

実際には、それらをHashMapsと考えるのは、いくつかの特殊な方法をとっても、とにかく、これは有効です。var a = []; a['cat']='meow';です。

+0

あなたの定義によるかもしれません。それは確かにJavascriptのすべての準拠のバージョンで実行される、それはperformantとポータブルと他のすべての良いCSのものです。しかし、それは本当に悪い計画だ。 – Malvolio

+7

そして、人々はJSとwebGLで地震を作りました:P – fabspro

+3

http://code.google.com/p/quake2-gwt-port/ – fabspro

10

Javascript配列は通常、ハッシュマップ(Javascriptオブジェクトと同様)として実装されています。属性としてはlengthがあり、これはキーとして使用された正の最大値より1つ高い値です。 からまで、文字列、浮動小数点数、負の数値でもキーを使用することはありません。いい意味を除いては何もない。

+0

私はこれを読んでいました。ありがとうございました – spencercooly

4

JavaScriptの配列があり、言語仕様特異部15.4によって決定されていませんどの。 Arrayは、特定のデータ構造のメモリレイアウトのインプリメンテーションの詳細ではないオペレーションの観点から定義されています。

Arrayリンクリストの上に実装できますか?はい。これにより、shiftunshiftなどの特定の操作が効率的になる場合がありますが、Arrayにはインデックスで頻繁にアクセスされるため、リンクリストでは効率的ではありません。

リンクリストなしで両方の世界のベストを得ることも可能です。 circular queuesのような矛盾するメモリデータ構造は、効率的な挿入/除去と効率的なランダムアクセスの両方を有する。

実際には、ほとんどのインタプリタは、C++ vectorまたはJava ArrayListと同様に、サイズ変更可能または再割り当て可能な配列をベースにしたデータ構造を使用して密な配列を最適化します。

関連する問題