var err1 = Error('message');
var err2 = new Error('message');
有什么不同?在chrome控制台中查看它们,它们看起来相同。对象和__proto__链上的属性相同。几乎Error就像是工厂一样。
哪一个是正确的,为什么?
var err1 = Error('message');
var err2 = new Error('message');
有什么不同?在chrome控制台中查看它们,它们看起来相同。对象和__proto__链上的属性相同。几乎Error就像是工厂一样。
哪一个是正确的,为什么?
Answers:
两者都很好;这在规范中有明确说明:
...因此,函数调用
Error(…)等效于new Error(…)具有相同参数的对象创建表达式。
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")会创建对象。
Object=> Object('foo')返回一个String对象...来的事它几乎所有的原生构造是有点不对劲...... Number,Boolean,Date,String所有不... Array,Object和Error做,但是Event所有DOMxxxx-api构造函数都会引发错误
new Array(arguments)并不能完全Array(1, 2, 3)做到。但可能我只是在挑剔:)
Error实例(或字符串文字)会松开堆栈跟踪。对链接的文章只是一个吹毛求疵:arguments.callee禁止在严格的模式
new。