我正在寻找一种智能方法来检查传递给函数的对象参数

I am looking for a smart way to check the object parameter passed to a function

本文关键字:检查 函数 参数 对象 方法 智能 寻找 一种      更新时间:2023-09-26

我处于以下情况:

我必须检查传递给函数的对象参数是否有效:

例:

function (opt) {
     if (opt && opt.key && opt.key2) {
         // make something
     }
}

有没有更好的方法来进行这种检查?

不是真的。

除非你可以使用opt.pleaseReadMyMind();-)

但是,您可以创建一个方法来检查所有字段的值是否与null 不同。

这是

最紧凑的方法。

最正确的方法是:

if( typeof opt !== "undefined" && typeof opt.key !== "undefined" && typeof opt.key2 !== "undefined") {

但正如你所看到的,这是一个相当拗口的,并不是真的必要。

只需编写一个简单的测试例程来验证给定属性名称列表的对象:

// usage: testProps(object to test, [list, of, property, names])
// returns true if object contains all properties
function testProps(obj, props)
{
  if (obj === null)
    return false;
  var i;
  for (i=0; i<props.length; ++i) 
  {
    if (!(props[i] in obj)) 
      return false;
  }
  return true;
}

然后在您的函数中:

if (!testProps(obj, ['key', 'key2'])
   return;

你正在做的事情是有效的,但它确实有缺陷。

if (opt && opt.key && opt.key2) {

如果opt.key具有错误值 [0、null、false 等],则此检查将失败

在这种情况下,您必须执行一种类型的检查以确保它不是未定义的。

if (opt && typeof opt.key !== "undefined" && opt.key2) {

是的,但是只有当你有很多键要检查,而不仅仅是三个键时,它才会"更好"。像这样:

function opt(opt) {
    for(var i = 0; i<3; i++) {
        if(typeof opt["key"+((i > 0) ? "" : i + 1))] === "undefined") {
            return;
        }
    }
    // create object
}

如果未定义opt则其所有键也将未定义,因此也对此进行了隐式检查。

您还可以定义要在数组中签入的变量名称,如下所示:

var propsToCheck = ["key", "key1", "key2"];
function(opt) {
    for(var i = 0, ii = propsToCheck.length; i<ii; i++) {
        if(typeof opt[propsToCheck[i]] === "undefined") {
            return;
        }
        // create object
    }
}

这不是一个更好的解决方案,但如果您打算检查三个或四个以上的属性,它确实允许更少的键入。

你总是可以这样做:

function validate(o, args) {
    if (typeof(o) == 'object' && args instanceof Array) {
        for (var i = args.length - 1; i >= 0; --i) {
            if (typeof(o[args[i]]) === 'undefined') return false;
        }
        return true;
    } else {
        return false;
    }
}
function myFunction(obj) {
    if (validate(obj, ['foo', 'bar'])) {
        // Your code goes here.
    } else {
        // Object passed to the function did not validate.
    }
}

这里有一个小提琴给你:http://jsfiddle.net/reL2g/