Error( 'msg')をスローするvs新しいError( 'msg')をスローする


165
var err1 = Error('message');
var err2 = new Error('message');

違いは何ですか?それらをChromeコンソールで見ると、同じに見えます。オブジェクトと同じ__proto__チェーンの同じプロパティ。ほとんどError工場のように振る舞うようです。

どちらが正しいのですか?その理由は?


5
すべてのネイティブコンストラクターは、ECMAScriptで定義されていnewます。
— 私はレイジーが

回答:


164

どちらも問題ありません。これは仕様で明示的に述べられています:

...したがって、関数呼び出しError(…)はnew Error(…)、同じ引数を持つオブジェクト作成式と同等です。


7
ES6でも同じですか?
— paulmelnikow

4
はい。最新のドキュメントについては、ecma-international.org
— 262

@paulmelnikow-はい。下位互換性はTC39の最優先事項です。マントラは「ウェブを壊さないこと」です。
— TJクラウダー2018

17

Errorいくつかの他のネイティブコンストラクタと同様に、工場のように振る舞うんArray、Objectなどのようにすべてのチェック何かをif (!(this instanceof Array)) { return new Array(arguments); }。(しかし、注目すべきことString(x)とnew String(x)は非常に異なる、と同様にするためのものであるNumberとBoolean。)

、エラーの場合には、さえスローする必要はないと述べているErrorオブジェクトを... throw 'Bad things happened';動作しますが、あまりにも
あなたも、デバッグするためのオブジェクトリテラルを投げることができます。

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

9
私は完全に同意していません。String("abc")はStringオブジェクトを作成しませんが、作成しますnew String("abc")。
— pimvdb

2
@pimvdb:trueの場合、私は、それを変更しましたObject=>は、Object('foo')文字列オブジェクトを返します...それの事に来るほとんどすべてのネイティブのコンストラクタをビット間違っている... Number、Boolean、Date、Stringすべてが...ないArray、ObjectとErrorやります、しかしEvent、すべてのDOMxxxx-apiコンストラクターはエラーをスローします
— Elias Van Ootegem

また、new Array(arguments)正確には何もしないと思いますArray(1, 2, 3)。しかし、おそらく私はつまらないです:)
— pimvdb

8
文字列のスローに関して
— 補足

11
@alex:確かに、非Errorインスタンス(または文字列リテラル)をスローすると、スタックトレースが失われます。リンクされた記事のarguments.callee
— ほんの一瞬
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.