2012-11-08 65 views
82
var err1 = Error('message'); 
var err2 = new Error('message'); 

有什麼區別?在Chrome控制檯中查看它們,它們看起來完全相同。物件上的同一屬性與同一個鏈條相同__proto__。幾乎看起來像Error就像一個工廠。throw Error('msg')vs throw new Error('msg')

哪一個是正確的,爲什麼?

+5

所有原生構造函數在ECMAScript中定義,包括它們各自的當不用'new'調用時的行爲。 –

+2

另請參見[何時'錯誤()'比'錯誤()'更好?](http://stackoverflow.com/q/38759428/1048572) – Bergi

回答

82

兩者都很好;這是在the specification明確表示:

...這樣的函數調用Error(…)相當於對象創建表達式new Error(…)具有相同的參數。

+0

這在ES6中也是如此嗎? – paulmelnikow

11

Error確實像一個工廠,其實幾乎所有的原生構造做:ArrayObject ......所有檢查類似if (!(this instanceof Array)){ return new Array(arguments);}

這就是說,在一個錯誤的情況下,它甚至不要求拋出Error對象... throw 'Bad things happened';會工作,也
你甚至可以拋出的對象常量進行調試:

throw {message:"You've been a naughty boy", 
     context: this, 
     args: arguments, 
     more:'More custom info here'}; 
+3

恐怕我不完全同意。 'String(「abc」)'不會創建'String'對象,而'new String(「abc」)'不會。 – pimvdb

+1

@pimvdb:true,我把它改成了Object' =>'Object('foo')'返回一個字符串對象...來到它的東西_幾乎所有本地構造函數都有點錯......數字','布爾','日期','字符串'都不會...'Array','Object'和'Error'這樣做,但是'Event'和所有'DOMxxxx'-api構造函數都會拋出錯誤 –

+0

我也認爲'新的數組(參數)'不能完全做'數組(1,2,3)'。但可能我只是挑剔:) – pimvdb

相關問題