2016-08-19 7 views
8

私がいくつかのページから読んだ密な配列の説明は、互いに矛盾しているようです。私はそれが何であるかを理解する助けをしたいと思います。密集配列とは正確には何ですか?

いくつかのリンク(search result 1search result 2)は、単にアレイであることを示唆しているものの:アレイの

  1. 要素が特定の値であることが知られています。
  2. は、初期化時に配列に割り当てられます。

JavaScript配列が密集していることがあります。

ここまではすべて意味があります。 JavaScript Guide on the Mozilla Developer Network (MDN)から取ら

しかし、この文は言う:配列の長さは、いつでも変更することができますので

、およびデータは、アレイ内の非連続の場所に保存することができ、JavaScriptの配列は ではありません密集していることが保証されています;これはプログラマがどのようにそれらを使用するために を選択するかに依存します。一般に、これらは便利な特性です。 これらの機能がご使用に適していない場合は、 型付き配列の使用を検討してください。

これは今私を混乱させる。私の質問は次のとおりです:

MDNページのステートメントは、JavaScript配列が密であることが保証されていないと言っていますか?初期化時に1つまたは複数の要素がundefinedであるため、次の配列が密な配列でない場合は、上にリストしたリンクがJavaScript配列が実際に密であることを示すように見えるのはなぜですか?

var array = new Array(1, , 3,); // [1, undefined, 3, undefined] 
+3

どのように配列が初期化されたかは無関係です。配列*の状態は重要です。 'var arr = [1,2,3,4]'は密な配列を作成しますが、次に 'arr [ 20] = 20'になりました。 – nnnnnn

+0

@nnnnnnありがとう、私はそれを得る。すべての要素が密であるという密かな意味は、価値を持ち、したがって記憶を取ります。 –

+0

ところで、これは無効な構文です: 'new Array(1、、3、)'。 '[1、、3、]'と混同しているかもしれません。 –

答えて

8

「疎」は「疎」とは反対であり、一般的にストレージについて話すときに使用されます。例えば、この配列は密である:

a = [undefined, undefined, 2] 

まさにそのようなメモリに記憶することができる:三箇所の順序を、最初の二つはundefinedされ、第三の2あります。

この配列は疎である:

a = [] 
a[100000000] = 100000000 

それは恐ろしく非効率的であるようにそれは、100000001点の位置のシーケンスとしてメモリに格納されていません。間違いなく100000000の場所はundefinedで、それに続いて100000000です。むしろ、それはちょうど100000000thが100000000であり、最初の100000000要素に割り当てられるスペースがないと言います。

(実際には、代わりに1000000002でこれをやろう、とあなたは好奇心旺盛なことに気付くでしょう:クロム[undefined, undefined, 2]として高密度アレイが、[undefined × 2, 2]スパースとして1が表示されます。)これらの記事は言う

+0

Underscore.jsのメンテナーは、非常に非効率的であるかどうかわかりませんが、Lodashとして知られるUnderscoreのフォークという結果になっています。 – vol7ron

+0

さらに、Chromeが配列をコンソールに表示する方法について、 'undefined'という値を持つ要素と比較して要素が1つ欠けている場合、' undefined'ではなく 'undefined x1'と言うでしょう。いつも何が何であるかを教えてください... – nnnnnn

+1

私はあなたが本当にそれについて論じることはできません:1つの値を格納するために100000000のメモリ位置を割り当てることは非効率的です。一般的な記述ではありませんでした(「高密度配列は非効率的です」)が、このシナリオに固有のものです。 – Amadan

4

密集した配列を作成することができます。

すべての要素が設定されている:0から長さ1に、未定義値がないこれは、作成時に、そのようなアレイは、のような配列であるため、密であることを意味します。あるいは、0からlength-1までのすべての位置に値が割り当てられました(値が実際にはundefinedであっても)。要素とは異なり

a[20] = "bat"; 

密集したことが、配列は、要素0 1 2ので、もはや密ではなく、20(:

しかし、あなたはこのような何かを行うことによって、もはやそれらの配列が密ではないことができます3〜19)は値に設定されます(この配列には21ではなく4つの要素があります)。

+0

ありがとうございます。私はちょうど他の人にランダムに投票しなければならなかった。 –

関連する問題