var err1 = Error('message');
var err2 = new Error('message');
有什麼區別?在Chrome控制檯中查看它們,它們看起來完全相同。物件上的同一屬性與同一個鏈條相同__proto__
。幾乎看起來像Error
就像一個工廠。throw Error('msg')vs throw new Error('msg')
哪一個是正確的,爲什麼?
var err1 = Error('message');
var err2 = new Error('message');
有什麼區別?在Chrome控制檯中查看它們,它們看起來完全相同。物件上的同一屬性與同一個鏈條相同__proto__
。幾乎看起來像Error
就像一個工廠。throw Error('msg')vs throw new Error('msg')
哪一個是正確的,爲什麼?
兩者都很好;這是在the specification明確表示:
...這樣的函數調用
Error(…)
相當於對象創建表達式new Error(…)
具有相同的參數。
這在ES6中也是如此嗎? – paulmelnikow
Error
確實像一個工廠,其實幾乎所有的原生構造做:Array
,Object
......所有檢查類似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'};
恐怕我不完全同意。 'String(「abc」)'不會創建'String'對象,而'new String(「abc」)'不會。 – pimvdb
@pimvdb:true,我把它改成了Object' =>'Object('foo')'返回一個字符串對象...來到它的東西_幾乎所有本地構造函數都有點錯......數字','布爾','日期','字符串'都不會...'Array','Object'和'Error'這樣做,但是'Event'和所有'DOMxxxx'-api構造函數都會拋出錯誤 –
我也認爲'新的數組(參數)'不能完全做'數組(1,2,3)'。但可能我只是挑剔:) – pimvdb
所有原生構造函數在ECMAScript中定義,包括它們各自的當不用'new'調用時的行爲。 –
另請參見[何時'錯誤()'比'錯誤()'更好?](http://stackoverflow.com/q/38759428/1048572) – Bergi