我正在设置一种将函数数组参数设置为默认值的方法(一个ES5而不是新的ES6 / 2015)。
我的第一个想法是:
window.fnc = function(args){
defaults = {
height: 120,
width: 32
}
args = args || defaults;
console.log(args['height']+'x'+args['width'])
}
将像这样使用:
fnc({height:45, width:12}); //Result: 45x12
或
fnc(); //Result: 120x32
这没关系。但是当然在第7行,args被默认值替换,或者不是,所以如果缺少2个值中的任何一个,我得到undefined
。
fnc({height:45}); //Result: 45xundefined
我该怎么做?
答案 0 :(得分:3)
我不时使用此代码段:
args = args || defaults;
for (var opt in defaults) {
if (defaults.hasOwnProperty(opt) && !args.hasOwnProperty(opt)) {
args[opt] = defaults[opt];
}
}
基本上,您遍历默认参数(for (var opt...
)中的所有值,并检查参数的值是否丢失。 (if (defaults.has...
)。如果缺少,请添加默认值(args[opt] =...
)。
(我想我甚至在SA上找到了这个片段,但不确定。如果是的话,会添加原始答案的链接。)
答案 1 :(得分:2)
您可以迭代默认键以复制args中缺少的键。
window.fnc = function(args){
defaults = {
height: 120,
width: 32
}
//args = args || defaults;
if(args == null)
args = defaults;
else {
for(var i in defaults) {
if(args[i] == null) args[i] = defaults[i];
}
}
console.log(args['height']+'x'+args['width'])
}
如果defaults
中有子对象,则需要执行递归功能。
编辑:
递归示例:
// check if obj is an object
function isObject(obj) {
return typeof obj == "object";
}
// check if obj is an array
function isArray(obj) {
return (typeof obj == "object") && (Object.getPrototypeOf( obj ) === Array.prototype);
}
// copy the attributes from original into dest
function copy_attributes(original, dest) {
for(var i in original) {
if(isArray(original[i])) {
dest[i] = JSON.parse(JSON.stringify(original[i])); // copy
}
else if(isObject(original[i])) {
copy_attributes(original[i], dest[i]);
}
else {
dest[i] = JSON.parse(JSON.stringify(original[i])); // copy
}
}
};