[英]Javascript default array/object parameter value
我正在准备将函数数组参数设置为默认值(一个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被默认值替换了,或者没有被替换,因此,如果缺少两个值之一,我将得到一个undefined
。
fnc({height:45}); //Result: 45xundefined
我该怎么办?
我不时使用以下代码段:
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上都找到了此代码段,但不确定。如果是,将添加指向原始答案的链接。)
您可以迭代默认键以复制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
}
}
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.