我想要一个代码高尔夫解决方案来做与以下相同的事情:
myFunc = function( config ){
if ( typeof config !== 'object' ) { config = {}; }
config.property = config.property || 123;
};
基本上,是否有更短的方法来确保我总是传递一个对象,如果没有,则创建它,并为其分配随机值?
答案 0 :(得分:1)
这是另一种在默认值方面更有效的替代方案。在当前代码中(赋值右侧有||
短路),即使已经设置了值,也会总是进行分配。使用以下语法,仅在需要默认值时才进行分配。
var myFunc = function(config) {
config || (config = {});
config.property || (config.property = 123);
};
请注意,这是一个微观优化,永远不会产生可衡量的性能差异,但我认为这是一个简洁的方法,问题本身是一种微优化开始:)
<小时/> 编辑:这可能是假设的,但无论如何也许值得一说。只要确保“已经过检查?”||
左侧的表达式对所设置的值的类型有意义。例如,如果0
是一个有效值,那么你需要一个比当前存在的更强大的表达式(它将为任何假值分配默认值)。另一种方法是检查属性是否已定义。
答案 1 :(得分:1)
我通常使用合并助手,通常是jQuery.Extend()
(参见documentation)。但是如果你不想使用jQuery,那么写一个类似的帮助程序也是微不足道的。但我通常会这样做:
myFunc = function( config ){
var defaults = { property: 123 };
config = $.extend({}, defaults, config);
};
基本上,您使用默认值扩展空对象,然后扩展传入的配置。您将始终获得至少具有defaults
属性的新对象。我肯定会建议将对象合并代码抽象到自己的帮助器中,如果只是因为你不在每个构造函数中重复相同的逻辑。
答案 2 :(得分:0)
一个班轮,虽然变量名称保持较长以便于阅读:
myFunc = function(config) {
(config.property) ? config : {property: 123};
}
答案 3 :(得分:0)
由于您希望防止配置作为普通对象以外的其他方式传递,我认为您不能缩短它或使用此处提供的大多数其他版本。事实上,我认为您必须添加额外的测试以查看配置是否不是null
,因为null
具有typeof'object'。
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);