Throw error ('msg') vs throw new Error ('msg')

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

Какая разница? Глядя на них в хром-консоли, они выглядят одинаково. Те же свойства на объекте и в той же цепочке __proto__. Почти похоже на то, что Error действует как factory.

Какой из них правильный и почему?

Ответ 1

Оба хороши; это явно указано в спецификация:

... Таким образом, вызов функции Error(…) эквивалентен выражению создания объекта new Error(…) с теми же аргументами.

Ответ 2

Error действует как фабрика, как и некоторые другие собственные конструкторы: Array, Object и т.д., Все проверяют что-то вроде if (!(this instanceof Array)) { return new Array(arguments); } 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'};