921

このような配列を宣言することの本当の違いは何ですか:

var myArray = new Array();

var myArray = [];
4

18 に答える 18

1038

違いはありますが、その例では違いはありません。

より詳細な方法を使用する:new Array()パラメーターに 1 つの追加オプションがあります: コンストラクターに数値を渡すと、その長さの配列が取得されます。

x = new Array(5);
alert(x.length); // 5

配列を作成するさまざまな方法を説明するには:

var a = [],            // these are the same
    b = new Array(),   // a and b are arrays with length 0

    c = ['foo', 'bar'],           // these are the same
    d = new Array('foo', 'bar'),  // c and d are arrays with 2 strings

    // these are different:
    e = [3]             // e.length == 1, e[0] == 3
    f = new Array(3),   // f.length == 3, f[0] == undefined

;

もう 1 つの違いは、 を使用new Array()すると、スタック サイズに影響する配列のサイズを設定できることです。これは、配列のサイズがスタックのサイズを超えたときに発生するスタック オーバーフロー ( Array.push と Array.unshift のパフォーマンス) が発生し、再作成する必要がある場合に役立ちます。したがって、実際には、ユースケースによってはnew Array()、オーバーフローの発生を防ぐことができるため、使用時にパフォーマンスが向上する可能性があります。

この回答で指摘されているように、new Array(5)実際にundefinedは配列に 5 つの項目を追加しません。5 つのアイテムのスペースを追加するだけです。この方法を使用すると、計算Arrayに依存することが難しくなることに注意してください。array.length

于 2009-05-31T11:25:01.970 に答える
799

暗黙的な配列を使用して配列を作成することと、配列コンストラクターを使用して配列を作成することの違いは微妙ですが、重要です。

を使用して配列を作成するとき

var a = [];

新しいランタイム配列を作成するようにインタープリターに指示しています。余分な処理は一切必要ありません。終わり。

使用する場合:

var a = new Array();

あなたはインタプリタに、コンストラクタ " Array" を呼び出してオブジェクトを生成したい、と言っています。次に、実行コンテキストを検索して呼び出すコンストラクターを見つけ、それを呼び出して配列を作成します。

「まあ、そんなことはどうでもいい。同じだ!」と思われるかもしれません。残念ながら、それを保証することはできません。

次の例を見てください。

function Array() {
    this.is = 'SPARTA';
}

var a = new Array();
var b = [];

alert(a.is);  // => 'SPARTA'
alert(b.is);  // => undefined
a.push('Woa'); // => TypeError: a.push is not a function
b.push('Woa'); // => 1 (OK)

上記の例では、最初の呼び出しで、予想どおり「SPARTA」がアラートされます。2番目はしません。undefined が表示されることになります。また、b には などのネイティブ Array オブジェクト関数がすべて含まれていますpushが、他のものには含まれていません。

これが起こることを期待するかもしれませんが、それ[]は と同じではないという事実を示しているだけnew Array()です。

[]配列だけが必要であることがわかっている場合は、単に使用するのがおそらく最善です。また、配列を一周して再定義することもお勧めしません...

于 2009-08-13T19:00:16.127 に答える
55

奇妙なことに、Chromenew Array(size)よりもほぼ 2 倍速く[]、FF と IE でほぼ同じです (配列を作成して埋めることによって測定)。配列のおおよそのサイズがわかっている場合にのみ重要です。指定した長さよりも多くのアイテムを追加すると、パフォーマンスの向上が失われます。

より正確にArray(は、メモリを割り当てない高速の定数時間操作であるのに対し、[]型と値を設定する線形時間操作です。

于 2010-06-28T12:35:02.810 に答える
44

詳細については、次のページで、使用する必要がない理由について説明します。new Array()

new Object()JavaScript で使用する必要はありません。{} 代わりにオブジェクト リテラルを使用してください。同様に、 を使用せず、 代わりnew Array()に配列リテラルを使用してください。[]JavaScript の配列は Java の配列とはまったく異なり、Java に似た構文を使用すると混乱するでしょう。

new Numbernew String、または を使用しないでくださいnew Boolean。これらのフォームは、不要なオブジェクト ラッパーを生成します。代わりに単純なリテラルを使用してください。

コメントもチェックしてください。このnew Array(length)フォームは、(少なくとも現在の JavaScript の実装では) 何の役にも立ちません。

于 2009-05-31T16:29:12.540 に答える
9

よりよく理解するため[]new Array()

> []
  []
> new Array()
  []
> [] == []
  false
> [] === []
  false
> new Array() == new Array()
  false
> new Array() === new Array()
  false
> typeof ([])
  "object"
> typeof (new Array())
  "object"
> [] === new Array()
  false
> [] == new Array()
  false

上記の結果は、Windows 7 の Google Chrome コンソールからのものです。

于 2012-07-27T22:56:40.750 に答える
8

最初のものは、デフォルトのオブジェクトコンストラクター呼び出しです。必要に応じて、そのパラメータを使用できます。

var array = new Array(5); //initialize with default length 5

2つ目は、空ではない配列を作成する機能を提供します。

var array = [1, 2, 3]; // this array will contain numbers 1, 2, 3.
于 2009-05-31T11:53:26.343 に答える
5

Fredrik の優れた例に基づいたこの例から始めて、より具体的な方法で説明できます。

var test1 = [];
test1.push("value");
test1.push("value2");

var test2 = new Array();
test2.push("value");
test2.push("value2");

alert(test1);
alert(test2);
alert(test1 == test2);
alert(test1.value == test2.value);

配列に別の値を追加して、4 つのアラートを作成しました。1 つ目と 2 つ目は、各配列に格納されている値を確認するためのものです。彼らは同じものを返します!3 番目のものを試してみると、false が返されます。

JS は、test1を array のデータ型を持つVARIABLEとして扱い、test2をarray の機能を持つ OBJECTとして扱いますが、ここにわずかな違いはほとんどありません。

最初の違いは、test1 を呼び出すと、何も考えずに変数を呼び出すことです。変数のデータ型を無視して、この変数に格納されている値を返すだけです。しかし、test2 を呼び出すとArray()関数が呼び出され、 「プッシュされた」値がその「Value」プロパティに格納されます。また、test2 にアラートを出すと同じことが起こり、配列オブジェクトの「Value」プロパティが返されます。

したがって、test1 が test2 と等しいかどうかを確認すると、もちろん true を返すことはありません。1 つは関数で、もう 1 つは変数 (配列の型を持つ) です。たとえそれらが同じ値を持っていたとしても!

それを確認するには、.value を追加して 4 番目のアラートを試してください。true が返されます。この場合、JS に「コンテナの型が関数であるか変数であるかは関係なく、各コンテナに格納されている値を比較して、あなたが見たものを教えてください!」と伝えます。それがまさに起こることです。

その背後にある考えを明確に伝えたかったのですが、私の英語が下手で申し訳ありません。

于 2013-05-06T16:52:20.330 に答える
3

var x = new Array()いくつかの機能が異なりますが、(私var x = []の意見では) 最も役立つ 2 つについて説明します。

違いを説明する前に、まずベースを設定します。使用x = []すると、配列のデータ型で新しい変数を定義し、配列プロトタイプに属するすべてのメソッドを継承します。これは、クラスの拡張にかなり似ています (ただし正確ではありません)。ただし、使用するx = new Array()と、変数に割り当てられた配列プロトタイプのクローンが初期化されますx

それでは違いを見てみましょう

最初の違いnew Array(x)は、 where xis a integerを使用すると、x未定義の値の配列が初期化されることです。たとえばnew Array(16)、16 個のアイテムで配列が初期化され、それらはすべて未定義です。これは、事前定義された長さの配列を非同期で埋める場合に非常に便利です。たとえば、(再び :)) 100 人の競合他社の結果を取得していて、それらをリモート システムまたはデータベースから非同期的に受信しているとします。受信したら、ランクに従って配列にそれらを割り当てる必要があります。それぞれの結果。この非常にまれなケースでは、次のようなことを行うmyArray[result.rank - 1] = result.nameため、ランク 1 はインデックス 0 などに設定されます。

2 番目の違いnew Array()、ご存知のように、配列プロトタイプのまったく新しいクローンをインスタンス化し、変数に割り当てることです。これにより、いくつかの魔法を実行できます (推奨されません)。この魔法は、従来の配列メソッドの特定のメソッドを上書きできることです。したがって、たとえばArray.push、新しい値を配列の末尾ではなく先頭にプッシュするようにメソッドを設定できます。また、配列プロトタイプのこの特定のクローンに新しいメソッドを追加することもできます (これはより良い方法です)。これにより、独自の追加メソッドを使用してプロジェクト全体でより複雑なタイプの配列を定義し、それをクラスとして使用できます。

最後に、アプリの処理オーバーヘッドとメモリ消費を気にするごく少数の人々 (私が心から愛している) の出身である場合は、アプリnew Array()を使用することを切望せずに苦労することはありません :)。

私はそれが獣について十分に説明したことを願っていますnew Array():)

于 2020-06-14T15:14:08.907 に答える
3

1 つ目は、デフォルトのオブジェクト コンストラクター呼び出しです。ほとんどの場合、動的な値に使用されます。

var array = new Array(length); //initialize with default length

2 番目の配列は、静的な値を作成するときに使用されます

var array = [red, green, blue, yellow, white]; // this array will contain values.
于 2016-08-31T17:06:07.527 に答える
3

これには、目に見える以上のものがあります。他のほとんどの答えは正しいですが、 ..

new Array(n)

  • nエンジンが要素のスペースを再割り当てできるようにします
  • アレイ作成用に最適化
  • 作成された配列は、配列操作のパフォーマンスが最も低いスパースとマークされます。これは、各インデックス アクセスで境界をチェックし、値が存在するかどうかを確認し、プロトタイプ チェーンをたどる必要があるためです。
  • 配列がスパースとしてマークされている場合、元に戻す方法はありません (少なくとも V8 では)。1 ミリ秒または 2 時間後にコンテンツ (パック配列) でいっぱいにしても、その有効期間中は常に遅くなります。問題ではありません。

[1, 2, 3] || []

  • 作成された配列はパックされているとマークされます (deleteまたは[1,,3]構文を使用しない場合)
  • 配列操作用に最適化( for ..forEachmapなど)
  • アレイが大きくなるにつれて、エンジンはスペースを再割り当てする必要があります

これはおそらく、古いブラウザー バージョン/ブラウザーには当てはまりません。

于 2019-12-10T15:49:58.467 に答える
2

使い方の違い

var arr = new Array(size);

または

arr = [];
arr.length = size;

この質問で十分に議論されているように。

速度の問題を追加したいと思います-現在最速の方法google chromeは2番目です。

ただし、注意してください。これらのことは、更新によって大きく変わる傾向があります。また、実行時間はブラウザによって異なります。

たとえば、私が言及した 2 番目のオプションは、 で 200 万 [ops/秒] で実行されますchromeが、試してみるとmozilla dev.、驚くほど高い 2300 万のレートが得られます。

とにかく、サイト自体を使用して、時々、さまざまなブラウザ(およびマシン)でチェックすることをお勧めします

于 2016-03-06T09:23:59.890 に答える
2

大きな違いはありません。基本的には同じことを行いますが、方法は異なりますが、W3C の次の声明を読んでください。

var cars = ["Saab", "Volvo","BMW"];

var cars = new Array("Saab", "Volvo", "BMW");

上記の 2 つの例は、まったく同じことを行います。new Array() を使用する必要はありません。
単純化、読みやすさ、および実行速度のために、最初のもの (配列リテラル メソッド) を使用します。

しかし同時にnew Array、悪い習慣と見なされる構文を使用して新しい配列を作成する:

new Array() を避ける

JavaScript の組み込み配列コンストラクタ new Array() を使用する必要はありません。
代わりに [] を使用してください。
次の 2 つの異なるステートメントは、points という名前の新しい空の配列を作成します。

var points = new Array();         // Bad
var points = [];                  // Good 

次の 2 つの異なるステートメントは両方とも、6 つの数値を含む新しい配列を作成します。

var points = new Array(40, 100, 1, 5, 25, 10); // Bad    
var points = [40, 100, 1, 5, 25, 10];          // Good

newキーワードはコードを複雑にするだけです。また、予期しない結果が生じる場合もあります。

var points = new Array(40, 100);  // Creates an array with two elements (40 and 100)

要素の 1 つを削除するとどうなりますか?

var points = new Array(40);       // Creates an array with 40 undefined elements !!!!!

したがって、基本的にはベスト プラクティスとは見なされません。また、1 つの小さな違いがありますnew Array(length)。このように長さを渡すこともできますが、これも推奨される方法ではありません。

于 2017-05-26T16:23:26.820 に答える
-4

Array コンストラクターを使用すると、必要な長さの新しい配列が作成され、各インデックスに未定義の値が入力されます。変数 1 に割り当てられた配列は、情報を提供するインデックスを作成します。

于 2015-11-19T16:20:37.193 に答える