кинути помилку ('msg') проти викинути нову помилку ('msg')


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

Яка різниця? Дивлячись на них у хромовану консоль, вони виглядають однаково. Однакові властивості на об’єкті та однаковий __proto__ланцюг. Майже здається, що Errorдіє як завод.

Який з них правильний і чому?


5
Всі вбудовані конструктори визначені в ECMAScript, включаючи їх відповідну поведінку при виклику без new.
Я ненавиджу ледачих

Відповіді:


164

Обоє добре; це прямо вказано в специфікації :

... Таким чином, виклик функції Error(…)еквівалентний виразу створення об'єкта new Error(…)з тими ж аргументами.


7
Це правда і в ES6?
paulmelnikow

4
Так. Поточні документи див .: ecma-international.org/ecma-262/6.0/…
thetherSide

@paulmelnikow - Так. Зворотна сумісність є найвищим пріоритетом TC39. Мантра полягає в тому, що "не розбивайте Інтернет".
TJ Crowder

17

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

9
Боюся, я не згоден повністю. String("abc")не створює Stringоб'єкт, тоді як new String("abc")робить.
pimvdb

2
@pimvdb: правда, я змінив його до Object=> Object('foo')повертає об'єкт рядки ... прийшов річ цього майже всі нативні конструкторів це трохи неправильно ... Number, Boolean, Date, Stringвсе не ... Array, Objectі Errorробити, але Eventі всі DOMxxxx-api конструктори кидають помилки
Elias Van Ootegem

Я також думаю, new Array(arguments)що не робить саме те, що Array(1, 2, 3)робить. Але, напевно, я просто
заїжджаю

8
Доповнення щодо кидання рядків: Рядок не є помилкою
alex

11
@alex: Дозволено, викидання Errorінстанцій (або рядкових літералів) втрачає слід стека. Лише вибирати arguments.callee
нитку
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.