2011-12-19 95 views
3

它更容易在在的話,那麼給出的以下情形的代碼解釋:更好地檢查未定義的屬性或設置爲空?

// one 

var myClass = function(a, b) 
{ 
    if(a) this.a = a; 
    if(b) this.b = b; 
} 

// two 

var myClass = function(a, b) 
{ 
    this.a = a || null; 
    this.b = b || null; 
} 

,說你有這個方法被調用不斷(許多次/秒)

myClass.prototype.doSomething = function() 
{ 
    if(this.a) // do something 
    if(this.b) // so something else 
}; 

在第一如果你檢查一個未定義的財產,而在第二個現有的財產,但價值null

哪種情況在JavaScript中表現更好?

+0

如果您真的想知道表現數字,那麼您應該你自己的jsperf(大約需要3分鐘),並運行在你認爲重要的任何瀏覽器中。回答性能問題的唯一方法是在您認爲相關的瀏覽器中進行測試。 – jfriend00 2011-12-19 20:43:11

+0

請記住,如果構造函數中a或b的期望值和合法值是像(0,「」,false等...)這樣的錯誤值,那麼這兩種方法(一種和兩種)都不起作用。爲了允許這些值,你必須在undefined參數中明確地測試a和b。 – jfriend00 2011-12-19 21:29:04

回答

3

我不知道我是否建立在一個最佳的方式測試,但這個網站的基準是巨大的:

http://jsperf.com/or-pipe-versus-if

我用得到的結果顯示IF語句代替或運算設置默認值的性能提高6%

+0

我使用Chrome/WinXP進行了相同的測試,「OR w/o values」是最快的情況,而其他情況下則慢92%或93% - 即其他所有情況大致相同。一個真實世界的案例大概只有部分時間有虛假或不提供的價值,我認爲OP也想考慮後來使用這些資產的速度(可能或可能沒有設定他們進行了測試)。還有,設置測試和提供網站鏈接的+1。 – nnnnnn 2011-12-19 21:08:30

0

這兩種情況都在測試構造函數中的a和b參數是否具有「真值」值。這意味着在這兩種情況下,如果傳入0或空字符串,或者(顯然)爲false,則該值將被丟棄。區別在於第一種情況不會在對象上創建屬性,而第二種情況默認爲​​null。

無論哪種方式,當您在doSomething()中實際使用時,您仍然必須測試該屬性,並且無論該屬性是否已設置,已設置爲null還是已明確設置爲0,您的if (this.a)測試都將起作用未定義。

如果你不想返回一個錯誤,如果不提供的值我會傾向於只需要直接將它們設置:

var myClass = function(a, b) 
{ 
    this.a = a; 
    this.b = b; 
} 

如果該參數不提供的價值屬性將被創建,但設置爲undefined,在您的doSomething()測試中仍會以完全相同的方式工作,但您將保存if或||測試的優點是不會丟掉0,空字符串或假值。這樣的構造是整潔的...

就實際性能比較你真的必須設置一個適當的測試(例如,在jsperf.com)。如果我不得不猜測,平均而言,if(a) this.a=a;版本會更快,因爲它只在a真實時才進行分配,但猜測性能是一個糟糕的計劃。直到你在不同的瀏覽器上測試它你不會真正知道 - 它可能是一種方式在IE中更快,而另一種方式在Chrome中速度更快。如果你設置了一個測試,一定要比較類似於我上面展示的直接任務。

編輯:我剛看到另一個答案,發現6%的性能差異。對於這樣一個最小的區別,並注意到如上所述,性能差異可能在某些瀏覽器中被顛倒過來,我認爲您最好編寫對您的處理需求最有意義的代碼,並且不要擔心性能。無論哪種方式(或包括我的答案的所有三種方式)清晰簡單,表現良好,但他們只是不完全相同......

相關問題