오류 발생 ( 'msg') vs 새 오류 발생 ( '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/...
theUtherSide

@paulmelnikow-예. 이전 버전과의 호환성은 TC39의 최우선 순위입니다. 진언은 "웹을 깨지 마십시오"입니다.
TJ Crowder

17

Error다른 기본 생성자처럼 공장처럼 행동 않습니다 Array, Object등 같은 모든 체크 뭔가를 if (!(this instanceof Array)) { return new Array(arguments); }. (그러나 참고 String(x)new String(x)매우 다른, 마찬가지로위한 것입니다 NumberBoolean.)

즉, 오류가 발생하더라도 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")만들지 않습니다. Stringnew String("abc")
pimvdb

2
@pimvdb : 사실, 나는 그것에 변경 한 Object=> Object('foo')반환 문자열 객체를 ... 그것의 일에 와서 거의 모든 기본 생성자 되는 비트 잘못 ... Number, Boolean, Date, String모두가하지 ... Array, ObjectError수행 그러나 Event모든 DOMxxxx-api 생성자에 오류가 던져
엘리아스 반 Ootegem

나는 또한 new Array(arguments)정확히 무엇을 Array(1, 2, 3)하지 않는다고 생각 합니다. 그러나 아마 나는 단지 nitpicking입니다 :)
pimvdb

8
문자열 던지기와 관련하여 보완 : 문자열은 오류가 아닙니다
alex

11
@alex : Error인스턴스 가 아닌 (또는 문자열 리터럴) 던지면 스택 추적이 느슨해집니다. 링크 된 기사 arguments.callee에서 엄선 된 선택 : 엄격 모드에서는 금지됨
Elias Van Ootegem
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.