var err1 = Error('message');
var err2 = new Error('message');
Какая разница? Глядя на них в хромированной консоли, они выглядят одинаково. Одинаковые свойства объекта и одинаковые __proto__
цепочки. Похоже, Error
действует как фабрика.
Какой из них правильный и почему?
javascript
exception
Илья Чоли
источник
источник
new
.new Error()
лучше чемError()
?Ответы:
Оба в порядке; это явно указано в спецификации :
источник
Error
это действует как фабрика, как и некоторые другие родные конструкторов:Array
,Object
и т.д. все проверки что - то подобноеif (!(this instanceof Array)) { return new Array(arguments); }
. (Но учтите, чтоString(x)
иnew String(x)
очень разные, и аналогично дляNumber
иBoolean
.)Тем не менее, в случае ошибки даже не требуется бросать
Error
объект ...throw 'Bad things happened';
тоже будет работать.Вы даже можете бросить литерал объекта для отладки:
источник
String("abc")
не создаетString
объект, тогда какnew String("abc")
делает.Object
=>Object('foo')
возвращает объект строки ... пришел вещь этого почти все нативные конструкторов это немного неправильно ...Number
,Boolean
,Date
,String
все не ...Array
,Object
иError
делать, ноEvent
и всеDOMxxxx
конструкторы -api выдают ошибкиnew Array(arguments)
что не делает именно то, чтоArray(1, 2, 3)
делает. Но, вероятно, я просто придираюсь :)Error
(или строковые литералы) теряет трассировку стека. Просто ничтожество на связанной статье:arguments.callee
запрещено в строгом режиме