2012-11-08 5 views
82
var err1 = Error('message'); 
var err2 = new Error('message'); 

違いは何ですか?クロムコンソールでそれらを見ると、彼らは同じように見えます。オブジェクトと同じチェーンに同じプロパティがあります。ほとんどの場合、Errorは工場のように動作します。throwエラー( 'msg')vs新しいエラー( 'msg')をスローする

どちらが正しいのですか?

+5

Errorオブジェクトをスローする... throw 'Bad things happened';
あなたも、デバッグ用のオブジェクトリテラルを投げることができ、動作します'new'なしで起動されたときの動作。 –

+2

も参照してください[新しいエラー()は 'Error()'よりも良いでしょうか?](http://stackoverflow.com/q/38759428/1048572) – Bergi

答えて

82

どちらも問題ありません。これは、明示的にthe specificationに記載されています

...このように関数呼び出しError(…)は、同じ引数を持つオブジェクト作成式new Error(…)と同等です。

+0

これもES6でも当てはまりますか? – paulmelnikow

11

Errorほとんどすべてのネイティブコンストラクタが行う実際には、工場のように動作します:ArrayObject、...すべてのエラーの場合には、それはでも必須ではありません、と述べたif (!(this instanceof Array)){ return new Array(arguments);}

のようなものをチェックそれぞれを含む、すべてのネイティブコンストラクタはECMAScriptの中で定義されてい

throw {message:"You've been a naughty boy", 
     context: this, 
     args: arguments, 
     more:'More custom info here'}; 
+3

私は完全に同意していないのでしょうか? 'String(" abc ")'は 'String'オブジェクトを作成しません。新しい文字列(" abc ")は作成します。 – pimvdb

+1

@pimvdb:true、それを 'Object' =>' Object( 'foo') 'に変更しました。文字列オブジェクトを返します。それは、ほとんどのネイティブコンストラクタ_ '、' Boolean'、 'Date'、' String'は全て '' Array''、 'Object''、' Error''ですが、 'Event'とすべての' DOMxxxx'-apiコンストラクタはエラーを投げます –

+0

'new Array(arguments)'は 'Array(1,2,3)'とまったく同じことをしないと思う。しかしおそらく私はちょうどニックピッキングしています:) – pimvdb

関連する問題