{}またはnew Object()を使用してJavaScriptで空のオブジェクトを作成しますか?


370

JavaScriptで空のオブジェクトを作成するには、2つの方法があります。

var objectA = {}
var objectB = new Object()

スクリプトエンジンがそれらを処理する方法に違いはありますか?どちらか一方をもう一方を使用する理由はありますか?

同様に、別の構文を使用して空の配列を作成することもできます。

var arrayA = []
var arrayB = new Array()

6
警告:非常にイライラするバグを引き起こす可能性のある小さな違いがあります!Objectプロトタイプで "{}"に割り当てる空のオブジェクトを作成すると、 "new"演算子で作成されたすべてのObjectインスタンスで同じObjectインスタンスになります。"new Object({})"を使用していますが、インスタンスは異なります。
peterh-2015年

フォートワースに加えていることを言及するために var objectA = {} var objectB = new Object()、同じ結果を生成します第三構文があります:var objectC = Object.create(Object.prototype);
kalitsov

{}およびの代わりに[] 使用し{}ますnew Object()。の[]代わりに使用しますnew Array()。メンバー名が連続した整数になる場合は、配列を使用します。メンバー名が任意の文字列または名前である場合は、オブジェクトを使用します。 出典
ilgaar 2017年

new Object()そして、{}かなりのオブジェクトを空にしていない、彼らはのObject.prototypeを持つオブジェクトです。Object.create(null)本当に空のオブジェクトに使用できます(少なくとも

回答:


459

オブジェクト

使用する利点はありませんnew Object();-のに対し、{};あなたのコードはよりコンパクト、かつ読みやすくすることができます。

空のオブジェクトを定義する場合、それらは技術的には同じです。{}構文は短く、すっきり(以下のJavaっぽい)で、あなたは即座にオブジェクトをインラインで取り込むことができます-ので、同じよう:

var myObject = {
        title:  'Frog',
        url:    '/img/picture.jpg',
        width:  300,
        height: 200
      };

配列

配列の場合も、1つのマイナーな例外を除いて、new Array();over を使用しても同じような利点はほとんどありません[];

var emptyArray = new Array(100);

すべてのスロットを含む100アイテムの長さの配列を作成しますundefined-これは、特定の状況(など(new Array(9)).join('Na-Na ') + 'Batman!')で便利な場合があります。

私の推薦

  1. 決して使用しないでくださいnew Object();-それはより不格好で{};、ばかげて見えます。
  2. 常に使用[];-事前定義された長さの「空の」配列をすばやく作成する必要がある場合を除きます。

22
Array(100)構文を使用していても、同じ配列の101番目の位置には未定義があります。数値が実際に行う唯一のことは、長さプロパティの値を変更することです。
Jason Bunting、

6
@パブロについては何も無効ではありませんnew Array(100)。文献を読む:developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…–MárÖrlygsson'08
08/20

9
@パブロ私はあなたの議論が何であるかわからない。Douglas Crockfordと同様に、の使用をお勧めし[]ます。そこに議論はありません。しかし、あなたはそれnew Array(100)が何らかの形で「無効」であると主張しましたが、これは事実ではありません。
MARÖrlygsson

10
また、あることに注意してくださいnew Array(1,2,3)では結果[1,2,3]が、new Array(1)ないではないにつながります[1]。したがって、のセマンティクスArrayは一貫性がなく、不必要に混乱しています。
Dancrumb、2014

3
私は追加したいObject.create(null)のに対し、空白のオブジェクトを作成するために有用であることができ{ }、オブジェクトのプロトタイプから継承。
Meow

90

はい、違いがあります、彼らは同じではありません。実際に同じ結果が得られることは事実ですが、エンジンは両方に対して異なる方法で動作します。それらの1つはオブジェクトリテラルで、もう1つはコンストラクターです。JavaScriptでオブジェクトを作成する2つの異なる方法です。

var objectA = {} //This is an object literal

var objectB = new Object() //This is the object constructor

JSではすべてがオブジェクトですが、new Object()では次のことに注意する必要があります。パラメーターを受け取ることができ、そのパラメーターに応じて、文字列、数値、または空のオブジェクトを作成します。

たとえばnew Object(1)、は数値を返します。new Object("hello")文字列を返します。これは、オブジェクトコンストラクターが-パラメーターに応じて-オブジェクトの作成を文字列、数値などの他のコンストラクターに委任できることを意味します。動的データをオブジェクトを作成します。

多くの作成者は、代わりに特定のリテラル表記を使用できる場合は、オブジェクトコンストラクターを使用しないことをお勧めしています。

詳細については、JavaScriptのリテラル表記とコンストラクタの違いをさらに読むことをお勧めします。


リテラル表記は、動的データオブジェクトを作成する場合、実際にはより読みやすく簡潔です。
2017

12

これらは同じ最終結果になりますが、リテラル構文を使用すると、JSON(JavaScriptリテラルオブジェクト構文の文字列化されたサブセット)の構文に慣れるのに役立ちます。 。

もう1つ、new演算子を使用し忘れた場合、微妙なエラーが発生する可能性があります。したがって、リテラルを使用すると、その問題を回避できます。

最終的には、状況だけでなく好みにも依存します。


8

オブジェクトおよび配列リテラル構文{} / []はJavaScript 1.2で導入されたため、4.0より前のバージョンのNetscape Navigatorでは使用できません(構文エラーが発生します)。

私の指はまだデフォルトでnew Array()と言っていますが、私は非常に老人です。ありがたいことに、Netscape 3は、今日多くの人が考慮しなければならないブラウザではありません...


11
Netscape 3?それは前世紀のことです!:-D
トマラック2008年

8
var objectA = {}

私の経験では、はるかに高速であり、より一般的に使用されているため、「標準」を採用し、タイピングを節約することがおそらく最善です。


1
実行が速くなりますか、それとも入力が速くなりますか?
ヒッピートレイル2012年

まあ、確かに、私は「入力する」ことを意味していましたが、余分な解析時間を考えると、おそらく実行方法も少しだけ速くなります:-)
ボビージャック

2
さらに、リテラルは通常、解析時に作成new Objectされますが、実行時に実行する必要があります。
Phrogz 2012

8

良いコーディング規約として、ここ{}のJavascriptビデオの1つで推奨されたと思います。疑似古典的継承には必要です。この方法は、これが古典的なオブジェクト指向言語ではなくプロトタイプ言語であることを思い出させるのに役立ちます。したがって、本当に必要になるのは、コンストラクター関数を使用しているときだけです。例えば:newvar obj = {};new

var Mammal = function (name) {
  this.name = name;
};

Mammal.prototype.get_name = function () {
  return this.name;
}

Mammal.prototype.says = function() {
  return this.saying || '';
}

次に、次のように使用されます。

var aMammal = new Mammal('Me warm-blooded');
var name = aMammal.get_name();

{}as oppose to を使用するもう1つの利点new Objectは、それを使用してJSONスタイルのオブジェクトリテラルを実行できることです。


7

アレイのインスタンス化パフォーマンス

長さのない配列を作成したい場合:

var arr = []; より速い var arr = new Array();

特定の長さの空の配列を作成したい場合:

var arr = new Array(x);よりも速いですvar arr = []; arr[x-1] = undefined

ベンチマークについては、次をクリックしてくださいhttps : //jsfiddle.net/basickarl/ktbbry5b/

ただし、両方のメモリフットプリントがわからないので、new Array()より多くのスペースを占有することは想像できます。


arr = new Array(x)arr = []; arr.length = x;、とx-1インデックスを割り当てるのではなく、と同等undefinedです。
ベルギ

2

これは基本的に同じことです。あなたがより便利だと思うものなら何でも使ってください。


おそらく私はここでJavaScriptを深く掘り下げていますが、それらは同じですか?の{proto} Objectはnullではありませんが、{proto} {}は 'Object.prototype'です。
イザキ、2014年

@IzhakiのプロトタイプObjectはnullです。これObjectは、プロトタイプチェーンを終了するためです。ただし、オブジェクトインスタンスにはプロトタイプはありません。コンストラクタのみがプロトタイプを持っています。そして(new Object()).constructor === ({}).constructor->true
トマラック2014年

それでこれは間違っていますか?
Izhaki 2014年

これが私のポイントです:new Object()空のObjectインスタンスを生成します。{}空のObjectインスタンスを生成します。これらのインスタンスはどちらも完全に区別できません。リンク先の例は他のことを行い(プロトタイプチェーンを変更します)、実際にはここには適用されません-または私はあなたの議論を理解していません。
Tomalak、2014年

1

わかりました。同じことを行う方法は2つしかありません。1つは呼び出さobject literalれ、もう1つは関数constructorです。

しかし、読んでください、私が共有したいことがいくつかあります:

を使用{}すると、コードが読みやすくなりますが、インスタンスObjectやその他の組み込み関数の作成は推奨されません...

また、オブジェクト関数はObject(params)...のような関数であるためパラメーターを取得しますが{}、JavaScriptでオブジェクトを開始する純粋な方法です...

オブジェクトリテラルを使用すると、コードが他の開発者にとってより見やすく、読みやすくなり、JavaScriptのベストプラクティスと一致します...

JavaScriptのオブジェクトはほとんど何でも{}かまいませんが、JavaScriptオブジェクトをポイントするだけです。それがどのように機能するかをテストするには、JavaScriptコードまたはコンソールで以下を実行します。

var n = new Object(1); //Number {[[PrimitiveValue]]: 1}

驚いたことに、それは数を作成しています!

var a = new Object([1,2,3]); //[1, 2, 3]

そして、これは配列を作成しています!

var s = new Object('alireza'); //String {0: "a", 1: "l", 2: "i", 3: "r", 4: "e", 5: "z", 6: "a", length: 7, [[PrimitiveValue]]: "alireza"}

そして、この奇妙な結果String

したがって、オブジェクトを作成している場合は、オブジェクトリテラルを使用し、標準コードを使用して上記のようなコードの事故を回避することをお勧めします。また{}、私の経験では、パフォーマンスを重視した方が優れています!


あなたはデズフーリですか?イランでは?
イーサン2017

こんにちはEhsanさん、はい、しかし私はイランの仲間に住んでいません。あなたはここで素晴らしいプロフィールを持っています!はじめまして...
Alireza 2017

電話番号を保存して、プログラミングについてサポートを受けられますか?
イーサン2017

電報を使っているようですね。
イーサン2017

はい、確かに、私たちは確かに電報に関するいくつかの知識を共有することができます!___
Alireza
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.