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

Javascript 我正在寻找一种智能的方法来检查传递给函数的对象参数,javascript,Javascript,我的情况如下: 我必须检查传递给函数的对象参数是否有效: Exmaple: function (opt) { if (opt && opt.key && opt.key2) { // make something } } 有没有更好的方法进行这种检查?不太好 除非您可以使用opt.pleaseReadMyMind();-) 您可以创建一个方法来检查所有字段的值是否与null不同。这是最简洁的方法 最正确的方法是: if( t

我的情况如下:

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

Exmaple:

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") {
但正如你所看到的,这是一个相当多的问题,并不是真的需要。

是的,但如果你有很多钥匙要检查,而不仅仅是三把钥匙,那就“更好”了。大概是这样的:

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

    // create object
}
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.
    }
}

这并不是一个更好的解决方案,但如果您计划检查三个或四个以上的属性,它确实可以减少键入的次数。

您可以这样做:

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

    // create object
}
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.
    }
}

这里有一个提琴供您使用:

只要编写一个简单的测试例程,在给定属性名列表的情况下验证对象:

// 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 (opt && opt.key && opt.key2) {
如果
opt.key
具有错误的值[0、null、false,等等],则此检查将失败

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

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

Javascript中是否有反射之类的功能可以做到这一点?反射可以像这样实现:
for(这里的var方法){if(typeof this[method]=='function'){…}
什么?我怀疑这些属性是否真的被命名为
key1
key2
key3
,等等。@NiklasB.:你可能是对的,但我想给OP一些东西,而不是简单的“这是不可能的”。然后,你应该建议一种方法,实际上可以让人在数组或其他东西中定义属性的名称。当然,这只是我个人的意见。@NiklasB。当然,在看到你的评论之前,我已经编辑了我的答案。:-)为什么不为(var key in opt){if(opt.hasOwnProperty(key){…}}}}设置一个
我看不出只有特殊属性才应该以什么方式检查得更好的要求?更好的想法是主观的。