【问题标题】:throw Error('msg') vs throw new Error('msg')抛出错误('msg')与抛出新错误('msg')
【发布时间】:2012-10-28 23:32:44
【问题描述】:
var err1 = Error('message');
var err2 = new Error('message');

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

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

【问题讨论】:

标签: javascript exception


【解决方案1】:

两者都很好;这在the specification 中有明确说明:

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

【讨论】:

  • 在 ES6 中也是这样吗?
  • 是的。对于当前文档,请参阅:ecma-international.org/ecma-262/6.0/…
  • @paulmelnikow - 是的。向后兼容是 TC39 的最高优先级。口头禅是“不要破坏网络。”
【解决方案2】:

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'};

【讨论】:

  • 恐怕我并不完全同意。 String("abc") 不会创建 String 对象,而 new String("abc") 会。
  • @pimvdb: 是的,我已将其更改为Object => Object('foo') 返回一个字符串对象...来吧几乎所有本机构造函数有点不对劲...Number,Boolean,Date,String 都不要...Array,Object 和Error 可以,但是Event 和所有@987654346 @-api 构造函数抛出错误
  • 我也认为new Array(arguments) 并没有完全像Array(1, 2, 3) 那样做。但可能我只是在吹毛求疵:)
  • 关于抛出字符串的补充:A string is not an error
  • @alex:当然,抛出非Error 实例(或字符串文字)会丢失堆栈跟踪。只是对链接文章的挑剔:arguments.callee 在严格模式下被禁止
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-31
  • 1970-01-01
  • 1970-01-01
  • 2016-04-07
  • 1970-01-01
相关资源
最近更新 更多