首先,你不需要重新分配options
參數給var。其次,對於某些值要小心這樣的:
var foo = function (options) {
options = options || {};
var bar = options.bar || 42;
var baz = options.baz || 'fubar';
};
foo({ bar: 0, baz: "" });
裏面foo
,bar == 42
& baz == 'fubar'
因爲0
和""
是falsy。它可能會更好得更加詳細,以便更精確:
var foo = function (options) {
options = options || {};
var bar = typeof options.bar == 'undefined' ? 42 : options.bar;
var baz = typeof options.baz == 'undefined' ? 'fubar' : options.baz;
};
但是,待幹後,您可以創建一個defaults
對象,只是兩個對象擴展到settings
對象:
// generic shallow object extension, mutates obj1
var extend = function (obj1, obj2) {
for (var prop in obj2) {
if (obj2.hasOwnProperty(prop)) {
obj1[prop] = obj2[prop];
}
}
return obj1;
};
var foo = function (options) {
var defaults = {
bar: 42,
baz: 'fubar'
},
settings = extend(defaults, options);
};
由於您在此次調用中不再使用defaults
,因此發生變異並不重要。使用這種方法:
foo(); // -> settings = { bar: 42, baz: 'fubar' }
foo({ bar: 0 }); // -> settings = { bar: 0, baz: 'fubar' }
foo({ bar: 0, baz: "" }); // -> settings = { bar: 0, baz: '' }
用於提及虛假值(和擴展)的+1 –
使用'Object.keys'而不是'for ... in'循環,因爲它快了約9倍 – Raynos
添加到'extend()'的某些類型檢查將會非常好。 – chelmertz