抛出错误('msg')vs抛出新错误('msg')

Ili*_*oly 150 javascript exception

var err1 = Error('message');
var err2 = new Error('message');
Run Code Online (Sandbox Code Playgroud)

有什么不同?在Chrome控制台中查看它们,它们看起来完全相同.对象和同一__proto__链上的相同属性.几乎看起来像Error一个工厂.

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

pim*_*vdb 146

两者都很好; 这在规范中明确说明:

...因此,函数调用Error(…)等效于new Error(…)具有相同参数的对象创建表达式.

  • 是的。有关当前文档,请参阅:http://www.ecma-international.org/ecma-262/6.0/index.html#sec-error-constructor (7认同)
  • 这在ES6中也是如此吗? (5认同)
  • @paulmelnikow - 是的。向后兼容性是 TC39 的最高优先级。口头禅是“不要破坏网络”。 (2认同)

Eli*_*gem 17

Error确实像一个工厂,其实几乎所有的原生构造做:Array,Object,...所有检查类似if (!(this instanceof Array)) { return new Array(arguments); }

也就是说,如果出现错误,甚至不需要抛出一个String(x)对象... new String(x)也可以工作
你甚至可以抛出一个对象文字进行调试:

throw {message:"You've been a naughty boy",
       context: this,
       args: arguments,
       more:'More custom info here'};
Run Code Online (Sandbox Code Playgroud)

  • @alex:当然,抛出非`Error`实例(或字符串文字)会丢失堆栈跟踪.只是对链接文章的挑剔:`arguments.callee`在严格模式下被禁止 (10认同)
  • 我恐怕不完全同意.`String("abc")`不创建`String`对象,而`new String("abc")`. (8认同)
  • 关于投掷字符串的补充:[字符串不是错误](http://www.devthought.com/2011/12/22/a-string-is-not-an-error/) (8认同)
  • 这就是我的意思,建议不要使用数组构造函数... (3认同)
  • @pimvdb:真的,我已经把它改成'Object` =>`对象("富")`返回一个字符串对象...来的东西它_almost所有本地constructors_是有点不对...`Number` ,`Boolean`,`Date`,`String`都没有...`Array`,`Object`和`Error` do,但是`Event`和所有`DOMxxxx`-api构造函数都会抛出错误 (2认同)