我遇到以下情况:
我必须检查传递给函数的object参数是否有效:
〔实施例:
function (opt) {
if (opt && opt.key && opt.key2) {
// make something
}
}
有没有更好的方法进行此类检查?
答案 0 :(得分:1)
不是真的。
除非您可以使用opt.pleaseReadMyMind()
; - )
您可以创建一个方法来检查所有字段是否都具有与null
不同的值。
答案 1 :(得分:1)
这是最紧凑的方式。
最正确的方法是:
if( typeof opt !== "undefined" && typeof opt.key !== "undefined" && typeof opt.key2 !== "undefined") {
但是你可以看到它非常满口而且不是必需的。
答案 2 :(得分:1)
只需编写一个简单的测试例程来验证给定属性名称列表的对象:
// 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;
答案 3 :(得分:0)
是的,但如果您有很多要检查的钥匙,那只会“更好”,而不仅仅是三个。像这样:
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
}
}
并不是一个更好的解决方案,但如果您计划检查超过三个或四个属性,它确实可以减少输入。
答案 4 :(得分:0)
你可以这样做:
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/
答案 5 :(得分:0)
你在做什么是有效的,但确实有缺陷。
if (opt && opt.key && opt.key2) {
如果opt.key
falsely 值[0,null,false等等]
在这种情况下,您必须进行类型检查以确保它未定义。
if (opt && typeof opt.key !== "undefined" && opt.key2) {