web-dev-qa-db-ja.com

Javascript配列はまばらですか?

つまり、現在の時刻を配列のインデックスとして使用する場合:

array[Date.getTime()] = value;

インタプリタは0から現在までのすべての要素をインスタンス化しますか?ブラウザーごとに異なる方法がありますか?

[〜#〜] aix [〜#〜] カーネルにバグがあったことを覚えています。これはリクエストに応じて擬似ttyを作成しますが、「echo>/dev/pty10000000000」は、/ dev/pty0、/ dev/pty1、...を作成し、その後死んでしまいます。見本市は楽しかったですが、これが私の顧客に起こるのは望ましくありません。

90
Berry

JavaScript配列の実装方法はブラウザーごとに異なりますが、実際の配列を使用するのが非効率的な場合、通常はスパース実装(通常は通常のオブジェクトのプロパティアクセスに使用されるもの)にフォールバックします。

特定の実装に関する知識のある人に、密から疎への移行を厳密にトリガーするものに答える必要がありますが、例は完全に安全である必要があります。密な配列を取得したい場合は、明示的な長さ引数を使用してコンストラクターを呼び出し、実際に取得することを望みます。

Olliejによる詳細な説明については、 この回答 を参照してください。

36
Christoph

はい、そうです。これらは実際には内部的にハッシュテーブルであるため、大きな整数だけでなく、文字列、浮動小数点数、またはその他のオブジェクトも使用できます。すべてのキーは、ハッシュに追加される前にtoString()を介して文字列に変換されます。これはいくつかのテストコードで確認できます。

_<script>
  var array = [];
  array[0] = "zero";
  array[new Date().getTime()] = "now";
  array[3.14] = "pi";

  for (var i in array) {
      alert("array["+i+"] = " + array[i] + ", typeof("+i+") == " + typeof(i));
  }
</script>
_

ディスプレイ:

_array[0] = zero, typeof(0) == string
array[1254503972355] = now, typeof(1254503972355) == string
array[3.14] = pi, typeof(3.14) == string
_

_for...in_構文をどのように使用したかに注目してください。これは、実際に定義されたインデックスのみを提供します。より一般的なfor (var i = 0; i < array.length; ++i)スタイルの繰り返しを使用する場合、明らかに非標準の配列インデックスに問題があります。

62
John Kugelman

この種の目的のために設計されたjavascript構文を使用すると、問題を回避できます。辞書として扱うこともできますが、「for ... in ...」構文を使用すると、すべてを取得できます。

var sparse = {}; // not []
sparse["whatever"] = "something";
10
John Fisher

Javascriptオブジェクトはスパースであり、配列は自動維持された長さプロパティ(実際には最大のインデックスよりも1つ大きいnot定義された要素の数)といくつかの追加メソッドを備えた特殊なオブジェクトです。どちらにしても安全です。追加機能が必要な場合は配列を使用し、それ以外の場合はオブジェクトを使用します。

7
Justin Love

答えは、JavaScriptで通常当てはまることですが、「少しややこしい...」です。

メモリ使用量は定義されておらず、どの実装も愚かであることが許可されています。理論的には、 const a = []; a[1000000]=0;は、const a = [];。実際には、Microsoftでさえこれらの実装を避けています。

ジャスティンラブ 指摘、長さ属性はhighestインデックスセットです。ただし、インデックスが整数の場合にのみ更新されます。

したがって、配列はまばらです。ただし、reduce()、Math.max()、および「for ... of」などの組み込み関数は、0から長さまでの可能な整数インデックスの全範囲を調べ、「undefined」を返す多くのインデックスを訪問します。ただし、「for ... in」ループは、定義されたキーのみを訪問して、予想どおりに実行される場合があります。

Node.jsを使用した例を次に示します。

"use strict";
const print = console.log;

let a = [0, 10];
// a[2] and a[3] skipped
a[4] = 40;
a[5] = undefined;  // which counts towards setting the length
a[31.4] = 'ten pi';  // doesn't count towards setting the length
a['pi'] = 3.14;
print(`a.length= :${a.length}:, a = :${a}:`);
print(`Math.max(...a) = :${Math.max(a)}: because of 'undefined values'`);
for (let v of a) print(`v of a; v=:${v}:`);
for (let i in a) print(`i in a; i=:${i}: a[i]=${a[i]}`);

与える:

a.length= :6:, a = :0,10,,,40,:
Math.max(...a) = :NaN: because of 'undefined values'
v of a; v=:0:
v of a; v=:10:
v of a; v=:undefined:
v of a; v=:undefined:
v of a; v=:40:
v of a; v=:undefined:
i in a; i=:0: a[i]=0
i in a; i=:1: a[i]=10
i in a; i=:4: a[i]=40
i in a; i=:5: a[i]=undefined
i in a; i=:31.4: a[i]=ten pi
i in a; i=:pi: a[i]=3.14

だが。まだ言及されていない配列の場合もあります。

2
Charles Merriam