2010-11-27 6 views
15

多くの人が、新しいObject、new Array()を避け、代わりに{}を使うべきだと言います。 []、および真/偽です。新しいObject()の代わりに{}を使用し、新しいArray()の代わりに[]を使用し、新しいBoolean()の代わりにtrue/falseを使用するのはなぜですか?

newを使用するのではなく、オブジェクトまたは配列の新しいインスタンスを取得するためにリテラルコンストラクトを使用する利点は何ですか?私はCrockfordが新しく好きではないと思っていますが、それは主な議論ですか?例えば

+3

'新しいブール(真)'この補正で編集し 'true'に –

+0

と同等ではありません。 –

答えて

8

それぞれのコンストラクタを使用して、上のオブジェクトと配列リテラルの利点がある:

  • 短く、より可読
  • 安全:リテラルは、依然としてArray又はObjectコンストラクタは
  • おそらくオーバーライドされたときに動作しますより速いが、それは主な考慮事項ではないだろう(ボトルネックはコード内の他の箇所で発生する可能性が高い)。

配列の場合、リテラルの利点がもう一つあります。コンストラクタだけを使用して単一メンバーで配列を作成することは不可能です。次の段落は、質問が編集された今、もはや適切である:new Array(3)は長さ3

アップデートの配列を作成しながら、例えば、[3]は、ナンバー3である一つの要素を持つ配列を作成します。

ブール値に関しては、new Boolean(false)falseと同じではありません。 Boolean()コンストラクタはブールオブジェクトを作成しますが、falsetrueはブールプリミティブです。実際には、new Boolean(false)は、たとえばifステートメントのブール値に強制変換すると、trueと評価されます。要するに、Boolean()コンストラクタを使用する理由はほとんどありません。代わりにtruefalseを使用してください。同様に、文字列や数値などの他のプリミティブには、とNumberというプリミティブな文字列や数値とは異なるオブジェクトが生成され、一般的には避けるべきコンストラクタがあります。

+0

新しいBoolean()ステートメントの代わりに誤ったtrue/falseを削除するように元の質問を編集しました。 –

+2

@Paul:私は答えにブール値を残しておきます。それはまだ役に立つ情報です。 –

+0

はい、絶対に!ありがとう! –

4

、あなたはこれをしたい場合:

{name:"bla",address:"address"} 

新しいオブジェクト()の方法は、次のようになります。

var o = new Object(); 
o.name="bla"; 
o.address="address"; 

最初のものははるかに短いです。そして、私はそれが多くのブラウザでも速くなると思う(jsperf testcase)。

+0

早く、はい。数年前に 'new Array()'メソッドを試してから、 'arr.push()'ですべての値を追加しました - 追加する値は何千もありました(私は生命= _ =はありませんでした)。 。 ファッジ。すべての値を配列コンストラクタの 'new Array(val1、val2、val3 ...)'に入れるだけで、非常に高速でした! –

+1

@Kolink - おそらくあなたが '.push()'を呼び出していたからでしょう。ここでの質問は、コンストラクタ 'new Array(val1、val2、val3 ...)'とリテラル '[val1、val2、val3 ...]' – user113716

+0

'new Object()'と 'new Array()'です。大量のデータを構築してデータを頻繁に設定/追加する必要がある場合は、非常に高速です。パーサ/デコーダには、使用時に目に見える速度の向上があります。 –

3

私はそれがほとんど簡潔さだと思います。

[]、またはnew Object()と書くことができる場合は、と書くことができます。

new Boolean()は完全に冗長です。ブール値は常に真または偽のいずれかにする必要があるため、組み込み定数を使用する必要があります。

+0

'new Boolean(true)'は冗長性よりも悪いです。プリミティブ 'true'とは異なります。私の答えを見てください。 –

1

ほとんどの場合、object literalまたは配列リテラルで十分で使いやすくなります。プロトタイプメソッドを呼び出したり、適用することもできます(例:[] .prototype.slice.call(someObj))。ほとんどfasterです。 {}と[]のコンストラクタを上書きすることはできません。 ObjectArrayは{}と[]がインスタンスであるコンストラクタです。

+0

リンク先のjsperfテストを実行しましたが、リテラルは3つの中で最も遅いです(_私のマシン_)。私はそれがFirefox 3.6.12になっていると推測している –

+0

Chromeでテストを実行しました。リテラルの使用が高速でした。 jsperfページを下にスクロールすると、 'browserscope'の結果がいくつか追加されます – KooiInc

0

まだ説明していない1つの理由は、パラメータをArrayコンストラクタに渡すときのあいまいさです。これはすべて指定された動作です。ちょうど奇妙です。

new Array(1,2,3); // [1,2,3], that's OK 
new Array(1); // [undefined], some may expect to get [1] instead 

JavaScript配列は、単一の引数はArrayコンストラクタに渡され、その引数が数値である場合を除いて、所与の要素で初期化されます。この特殊なケースは、Arrayコンストラクタで作成されたJavaScript配列にのみ適用され、ブラケット構文で作成された配列リテラルには適用されないことに注意してください。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array#Syntax

関連する問題