2011-09-06 32 views
0

我想要的東西代碼高爾夫球解決方案,它下面的等價:Javascript對象違約

myFunc = function(config){ 
    if (typeof config !== 'object') { config = {}; } 

    config.property = config.property || 123; 
}; 

基本上是有一個較短的方式,以確保我一直在傳遞一個對象,如果沒有創建它,併爲它分配隨機值?

+1

可以'config'是什麼?在語義上,它看起來像是未定義的或者是一個對象(因爲你必須事實上分配屬性)。有沒有你不使用'||'的原因? – pimvdb

+3

要小心,typeof null ==「object」。 – shabunc

回答

1

我通常使用合併幫手,通常爲jQuery.Extend()(請參閱documentation)。但是如果你不想使用jQuery,那麼類似的幫手可能會寫得很微不足道。不過,我通常會做這樣的事情:

myFunc = function(config){ 
    var defaults = { property: 123 }; 
    config = $.extend({}, defaults, config); 
}; 

基本上,你正在擴展與默認值,然後你通過配置一個空的對象時,您總是會得到有至少你的defaults屬性的新對象。我肯定會推薦將你的對象合併代碼抽象爲它自己的幫助器,只要你不在每個構造器中重複相同的邏輯。

0

一個襯墊,雖然變量名保存更長的時間可讀性:

myFunc = function(config) { 
(config.property) ? config : {property: 123}; 
} 
+0

爲了記錄,它會在配置未定義的情況下引發錯誤。 – pimvdb

+0

此代碼不會執行任何操作,除非配置未定義時拋出錯誤(如pimvdb指出的那樣)。沒有任何作業。 – jmar777

1

這裏的另一個替代方案,是在默認值的小更高效。在當前代碼中(分配右側的||短路),即使已經設置了值,作業也是始終爲。使用下面的語法,僅當需要默認值時纔會進行分配。

var myFunc = function(config) { 
    config || (config = {}); 
    config.property || (config.property = 123); 
}; 

請注意,這是一個微型的優化,絕不會做出一個可衡量的業績差異,但我認爲這是一個整潔的方法和問題本身就是一種微optimizey的下手:)


編輯:這可能是假設,但也許值得說。只要確保你的「被檢查?」 ||左側的表達式對於設置的值的類型有意義。例如,如果 0是一個有效的值,那麼你會想要一個比當前更強大的表達式(它將在任何falsey值上分配默認值)。另一種方法是檢查屬性是否已定義。

0

既然你想防止配置被傳遞爲普通對象以外的東西,我不認爲你可以縮短它或使用這裏提供的大多數其他版本。事實上,我認爲你必須添加額外的測試,看看配置是不是null,因爲null有類型的'對象'。

myFunc = function(config){ 
    if (!config || typeof config !== 'object') { config = {}; } 

    config.property = config.property || 123; 
}; 

測試用例,這適用於:

myFunc(null); 
myFunc(); 
myFunc("{}"); 
myFunc("{property: 100}"); 
myFunc("aa"); 
myFunc([]); 
myFunc(5);