Javascript默认数组/对象参数值

时间:2015-12-30 23:47:42

标签: javascript arrays function

我正在设置一种将函数数组参数设置为默认值的方法(一个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

我该怎么做?

2 个答案:

答案 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
    }
  }
};