2013-08-27 33 views
0

某些函數返回相同的對象,不管是否被稱爲構造函數。我應該在調用返回相同對象的函數時使用`new`,不管是否被稱爲構造函數?

在性能方面,我應該使用

new RegExp(rg, flags);

new Array(1000);

new Object(whatever);

...

RegExp(rg, flags);

Array(1000);

Object(whatever);

...

編輯:我錯了,如果我使用Object()new Object()

+1

這個標題與問題很不相同。爲什麼不在[JSPerf](http://jsperf.com/)上運行一些測試?要真正回答這個問題,你需要指定你關心的瀏覽器和構造函數。我的直覺是,它不會對性能產生重大影響。 – fncomp

回答

2

這取決於類型它很重要。對於Array它相當於:

Array被稱爲函數,而不是作爲一個構造函數,它創建和初始化一個新的Array對象。因此函數調用Array(…)等價於具有相同參數的對象創建表達式new Array(…)

對於Object

Object被稱爲一個函數,而不是作爲構造,它執行一個類型轉換。 當Object被稱爲new表達式的一部分時,它是一個可以創建對象的構造函數。

您可以在spec中查找其他類型。

+0

感謝您的澄清,我錯了'Object' /'new Object'。但是在相同情況下的性能如何(例如'Array' /'new Array')? – Oriol

+0

@Oriol沒有區別。 – Doorknob

+0

@Oriol等待,實際上[使用'new'的速度要快得多,達到驚人的數量:97%!](http://jsperf.com/new-array-vs-array-with-items)當然,數組文字是最快的。 – Doorknob

0

在性能

方面在性能方面,使用的文字儘可能

// Array 
var arr = [0, 2, 4]; 

// Object 
var obj = {foo: 'bar'}; 

// RegExp 
var re = /foo/ig; 

PERF爲Array,香水,爲Object,香水,爲RegExp

+0

但是在某些情況下,不能使用文字,例如,在正則表達式中使用變量。那麼,我應該使用'new'還是不? – Oriol

+0

@Oriol對於正則表達式中的變量,您需要使用'new'來避免不好的做法(如'eval'),是的。 –

+0

但是我可以在不使用'eval'的情況下使用'RegExp(myvar,myflag)'(no'new') – Oriol

相關問題