抛出Error('msg')vs抛出新Error('msg')


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

有什么不同?在chrome控制台中查看它们,它们看起来相同。对象和__proto__链上的属性相同。几乎Error就像是工厂一样。

哪一个是正确的,为什么?


5
所有本机构造函数都是在ECMAScript中定义的,包括在不使用的情况下调用它们时各自的行为new
我讨厌懒惰的2012年

Answers:



17

Error确实像一个工厂,像其他一些本土的构造函数:ArrayObject,等所有的检查类似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:真的,我已经改变了它Object=> Object('foo')返回一个String对象...来的事它几乎所有的原生构造是有点不对劲...... NumberBooleanDateString所有不... ArrayObjectError做,但是Event所有DOMxxxx-api构造函数都会引发错误
Elias Van Ootegem 2012年

我也认为new Array(arguments)并不能完全Array(1, 2, 3)做到。但可能我只是在挑剔:)
pimvdb

8
关于抛出字符串的补充:字符串不是错误
Alex

11
@alex:允许,抛出非Error实例(或字符串文字)会松开堆栈跟踪。对链接的文章只是一个吹毛求疵:arguments.callee禁止在严格的模式
埃利亚斯凡Ootegem
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.