2014-12-02 82 views
1

使用集合,我想知道什麼是最佳做法:未定義屬性(缺少時)或將其定義爲false。Javascript performance for property access:undefined vs false

例子:

第一種情況:

[ 
{"age":42}, // first item 
{} // second item, age is undefined 
] 

第二種情況:

[ 
{"age":42}, // first item 
{"age":false} // second item, age is explicitly set to false 
] 

然後使用此集合用MongoDB的或AngularJS重複或什麼之內,我可以做到以下幾點:

if (item.age){ doSomething();} 

這兩個選項都是正確的。

我個人認爲第一個案例很有趣,因爲如果我們沒有一個信息我們沒有指定它但是有沒有找到一個缺失的財產的成本,缺陷或風險?

回答

3

...但是有沒有成本,缺陷或找到一個缺失的財產風險?

沒有任何意義,沒有。從技術上講,當你查找一個不在該對象上的屬性時,JavaScript引擎必須檢查對象的原型(及其原型等),理論上它有點慢(理論和現實可能不同),但原型鏈必須是,或者您必須在緊密時間敏感的循環中爲成千上萬個對象執行此操作,因爲如果是的話,那麼該問題鏈接將會影響  —。

如果真的困擾你離開房產,而不是false,你可能會考慮undefinednull。它們也是虛假的,但是(在我看來,無論如何)它們意味着更少。請注意,如果您在應用程序的某個地方使用JSON,JSON不具有undefined

記住這個公理:「不要過早地優化。」這在JavaScript世界中尤其適用,因爲在一個JavaScript引擎上更快的東西會使其在另一個JavaScript引擎上變得更慢。所以對於任何JavaScript性能問題的答案是:測試它並看看。

Here's a test關於直接來自Object.prototype的對象;三大瀏覽器的結果:

enter image description here

Here's another test,測試非常不現實的情況下,20深層次原型的

enter image description here

+0

您指的是正確的問題,使用undefined將在序列化期間簡單地刪除該屬性。以下是真的:'JSON.stringify({「age」:undefined})==「{}」'相反,使用null會讓我覺得屬性應該包含一個對象。 – 2014-12-02 08:16:36

+0

@FlavienVolken:如果將*序列化爲JSON *,則會丟棄,如上所述。 Re'null',這當然是它通常使用的方式,但是'false'給了我屬性應該包含布爾值的感覺。 :-)在這兩者中,我可能會使用'null'(但我可能完全離開該屬性)。 – 2014-12-02 08:23:22

+0

我的表演圖表顯示它稍微快一點,我終於切換回'undefined'。是的,添加一個'false'可能意味着檢查它不是一個布爾值,這基本上不是好的。 – 2014-12-02 08:45:00

0

它從您的性能需求組成。如果你想優化數據存儲,你應該減少數據大小。如果腳本時間更重要,正確的方法是將false設置爲默認值。但第二種方式可以提供錯誤日誌中隱藏的錯誤。所以你可以在調試中遇到問題。