防止未定义的参数

Tim*_*ner 3 javascript

所以我使用一个对象传递我的可选变量,如下所示:

var foo = function (options) {
            var options = options || {}; //provide a default, so that
            var bar = options.bar || 42; //this doesn't fail on 'foo();'
            //do stuff
        };
Run Code Online (Sandbox Code Playgroud)

JSLint抱怨我正在覆盖选项,如果它是假的,这就是我想要的.实际上,我应该检查它是否是一个对象,否则抛出错误让用户知道是什么.所以 - 在那个注意事项 - 这里有什么好的形式?有人对此有一个很好的解读吗?另外,我将如何以DRY风格编写一系列具有此模式的函数?

mVC*_*Chr 6

首先,您不需要将options参数重新分配给var.其次,对于某些值要小心:

var foo = function (options) {
            options = options || {};
            var bar = options.bar || 42;
            var baz = options.baz || 'fubar';
          };
foo({ bar: 0, baz: "" });
Run Code Online (Sandbox Code Playgroud)

里面foo,bar == 42baz == 'fubar'因为0""是falsy.为了更精确,更加冗长可能更好:

var foo = function (options) {
            options = options || {};
            var bar = typeof options.bar == 'undefined' ? 42 : options.bar;
            var baz = typeof options.baz == 'undefined' ? 'fubar' : options.baz;
          };
Run Code Online (Sandbox Code Playgroud)

但是,要成为DRY,您可以创建一个defaults对象,并将两个对象扩展到一个settings对象:

// generic shallow object extension, mutates obj1
var extend = function (obj1, obj2) {
  for (var prop in obj2) {
    if (obj2.hasOwnProperty(prop)) {
      obj1[prop] = obj2[prop];
    }
  }
  return obj1;
};

var foo = function (options) {
  var defaults = {
        bar: 42,
        baz: 'fubar'
      },
      settings = extend(defaults, options);
};
Run Code Online (Sandbox Code Playgroud)

由于您不会defaults在此调用中再使用它,因此它会发生变异并不重要.使用此方法:

foo();                    // -> settings = { bar: 42, baz: 'fubar' }
foo({ bar: 0 });          // -> settings = { bar: 0, baz: 'fubar' }
foo({ bar: 0, baz: "" }); // -> settings = { bar: 0, baz: '' }
Run Code Online (Sandbox Code Playgroud)