繁体   English   中英

JavaScript默认数组/对象参数值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM