176

新しい配列を宣言する必要がある場合は、この表記を使用します

var arr = new Array();

しかし、たとえばjsbinでオンラインでテストすると、「配列リテラル表記[]を使用してください」という警告が表示されます。

コンストラクターの使用を避ける理由が見つかりませんでした。使用するよりも何らかの方法で効率が低下し[]ますか?それとも悪い習慣ですか?

var arr = [];代わりに使用する正当な理由はありvar arr = new Array();ますか?

4

9 に答える 9

260

ほとんどの場合、ダグラス・クロックフォードがそう言っているのでvar a = []、人々は使用します。

彼の理由には、次のような直感的で一貫性のない動作が含まれますnew Array()

var a = new Array(5);     // an array pre-sized to 5 elements long
var b = new Array(5, 10); // an array with two elements in it

事前に指定された数値要素が1つnew Array()だけある配列を作成する方法はないことに注意してください。

実際に使用する[]方が効率的で安全です。コンストラクターを上書きしArrayて奇妙なことをさせることは可能ですが、の動作を上書きすることはできません[]

個人的には、私は常に[]構文を使用し、同様に常に。{}の代わりに構文を使用しますnew Object()

于 2012-07-16T08:25:09.383 に答える
48

重要な違いの1つは、[]常に新しい配列をインスタンス化するのに対し、ハイジャックされて別のオブジェクトを作成するnew Array可能性があることです。

(function () {
    "use strict";
    var foo,
        bar;
    //don't do this, it's a bad idea
    function Array() {
        alert('foo');
    }
    foo = new Array();
    bar = [];
}());​

私のサンプルコードでは、Array関数をドキュメントスコープの残りの部分から隠しておきましたが、この種の問題が発生した場合、コードが適切なクロージャに残されていない可能性が高くなります。見つけるのは難しいでしょう。

免責事項Array:コンストラクターを乗っ取るのは良い考えではありません。

于 2012-07-16T14:10:23.203 に答える
26

保守性のために、[]

ほとんどの開発者が使用するため、配列リテラルはより予測可能です。そこにあるほとんどの配列の使用法はリテラルを使用することであり、コードを他の開発者が使用するものと一致させることには価値があります。

空の配列の場合は、[]

var ns = [];
var names = [ 'john', 'brian' ];

ここに示すように、空のリテラルといくつかの既知の要素を使用することは、配列コンストラクターよりも太くなります。

既知のサイズの配列の場合は、new Array(size)

サイズがわかっている場合は、配列コンストラクターを使用するとパフォーマンスが大幅に向上します。ただし、すべての値を埋める「未定義」の配列を処理する必要があることも意味します。

ここに示すように

// fill an array with 100 numbers
var ns = new Array( 100 );
for ( var i = 0; i < 100; i++ ) {
    ns[i] = i;
}

これは、非常に小さなアレイでも機能します

于 2012-07-17T05:18:58.920 に答える
12

いいえ、実際には、空の配列に対して一方の表記をもう一方の表記よりも使用する理由はありません。

ただし、ほとんどのブラウザは、コンストラクタx = [];を呼び出すよりも使用するとわずかに優れたパフォーマンスを示します。

特定のサイズのアレイを作成する必要がある場合は、たとえば、10スロットのアレイを作成するために使用する必要があります。x = new Array(10);undefined

于 2012-07-16T08:25:16.067 に答える
7
  • var arr=[]は配列/オブジェクトリテラルを使用します
  • var arr = new Array()は配列/オブジェクトコンストラクターを使用します

コンストラクターを呼び出す必要がないため、配列またはオブジェクトを定義する最も高速な方法は文字通りの方法です。

var arr1 = new Array(1, 2, 3, 4);
var arr2 = [1, 2, 3, 4];

alert(arr1[0]); // 1
alert(arr2[0]); // 1

var arr3 = new Array(200);
var arr4 = [200];

alert(arr3[0]); // 'undefined'
alert(arr4[0]); // 200
于 2012-07-16T11:04:11.907 に答える
6

どちらも正しいだけです。しかし、ほとんどの人はvar a = []

JavaScriptで配列を宣言する3つの方法。

方法1:JavaScriptの「new」キーワードを使用して配列を明示的に宣言し、メモリ内の配列をインスタンス化できます(つまり、配列を作成して使用可能にします)。

// Declare an array (using the array constructor)
var arlene1 = new Array();
var arlene2 = new Array("First element", "Second", "Last");

方法2:配列を宣言するための代替方法を使用します。

// Declare an array (using literal notation)
var arlene1 = [];
var arlene2 = ["First element", "Second", "Last"];

メソッド3:JavaScriptでは、特定のメソッドを呼び出すことにより、間接的に配列を作成することもできます。

// Create an array from a method's return value
var carter = "I-learn-JavaScript";
var arlene3 = carter.split("-");
于 2012-07-16T08:35:36.950 に答える
4
var array = [ 1, 2, 3, 4];

砂糖です

var array = new Array(1, 2, 3, 4);

塩です

于 2012-07-16T13:58:32.687 に答える
4

コンストラクターが引数として取ることができる制限があります。

ほとんどのシステムでは、制限は2 ^ 16(2バイト)です。

var myFreshArr = new Array(0,1,2,3 ..... 65536);

エラーが発生します(引数が多すぎます...)

リテラル[]を使用する場合、そのような問題はありません。

このような大きな配列を気にしない場合は、好きなものを使用できると思います。

于 2012-07-16T08:25:04.657 に答える
3

new Array()あいまいだからです。正しいコンストラクターは次のとおりです。

// Using brackets
[element0, element1, ..., elementN]

// Using new AND a list of elements
new Array(element0, element1, ..., elementN)

// Using new AND an integer specifying the array length
new Array(arrayLength)
于 2012-07-16T08:25:11.200 に答える