103

つまり、現在の時刻を配列のインデックスとして使用すると、次のようになります。

array[Date.getTime()] = value;

インタプリタは0から現在までのすべての要素をインスタンス化しますか?ブラウザが異なれば、動作も異なりますか?

AIXカーネルにバグがあり、要求に応じて疑似ttyが作成されていたのを覚えていますが、「echo> / dev / pty10000000000」と言うと、/ dev / pty0、/ dev /pty1が作成されます。 ....そして死んで倒れます。見本市では楽しかったですが、これがお客様に起こらないようにしたいと思います。

4

7 に答える 7

75

はい、そうです。これらは実際には内部的にハッシュ テーブルであるため、大きな整数だけでなく、文字列、浮動小数点数、またはその他のオブジェクトも使用できます。すべてのキー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)スタイルの繰り返しを使用すると、明らかに非標準の配列インデックスで問題が発生します。

于 2009-10-02T17:17:58.157 に答える
42

JavaScript 配列がどのように正確に実装されるかはブラウザーによって異なりますが、実際の配列を使用すると効率が悪い場合は、通常はスパース実装 (通常のオブジェクトのプロパティ アクセスに使用されるものと同じものである可能性が最も高い) にフォールバックします。

密集から疎への移行を正確にトリガーするものに答えるには、特定の実装についてより知識のある人に尋ねる必要がありますが、あなたの例は完全に安全なはずです。密な配列を取得したい場合は、明示的な長さの引数を指定してコンストラクターを呼び出し、実際に取得できることを期待する必要があります。

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

于 2009-10-02T17:21:14.717 に答える
11

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

var sparse = {}; // not []
sparse["whatever"] = "something";
于 2009-10-02T17:29:12.860 に答える
7

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

于 2009-10-02T17:27:41.587 に答える