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

、エラーの場合には、さえスローする必要はないと述べている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')文字列オブジェクトを返します...それの事に来るほとんどすべてのネイティブのコンストラクタをビット間違っている... NumberBooleanDateStringすべてが...ないArrayObjectErrorやります、しかし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.