0

我想知道是否有经典的替代品。

if (typeof firstPost === 'object' && typeof firstPost.active === 'boolean' && typeof firstPost.message === 'string' && typeof firstPost.maxHeight)

以免编写更多代码,可能循环对象。

4

4 回答 4

2

我会用这个:

如果这是用户输入

var firstPost = {
    active    : true,
    message   : "hello",
    maxHeight : 20
}

然后:

var checks = {
    active    : 'boolean',
    message   : 'string',
    maxHeight : 'number'
}

try {
    for(var key in checks) {
        if(typeof firstPost[key] != checks[key]) {
            throw new Error(key + " is not " + checks[key]);
        }
    }
}catch(e) {
    alert(e.toString());
}

这不是无字节的,但更干净。(它还会检查是否定义了所有键)

编辑:没有比这更紧凑的了。但是,您可以在另一个地方声明一些函数并调用它。

function checkObject(obj,checks) {
    for(var key in checks) {
        if(typeof obj[key] != checks[key]) {
            return false;
        }
    }
    return true;
} 

简单地说

checkObject(firstPost,{
    active    : 'boolean',
    message   : 'string',
    maxHeight : 'number'
});

您可以详细说明另一种返回类型以指定错误。

于 2013-07-24T09:40:51.223 回答
0

如果总是有相同的类型,并且您更频繁地需要这个确切的类型,您可以将它包装在一个函数中。否则,我认为您的 if 构造是您唯一真正的可能性。当然,您可以创建一个对象,其中键为字段名,值作为所需类型,但我不会这样做,因为它不再易于阅读。

我想到的唯一会缩短这段代码(一点点)的事情是将 typeof 函数包装成这样的东西:

function is(variable, type){
  return typeof variable == type;
}

所以你可以这样称呼它is(firstPost, 'object')等等

于 2013-07-24T08:43:35.670 回答
0

第一个检查可以简化,因为对象实例是真实的!!{} === true,并且您不需要专门检查对象,因为您稍后会检查它是否具有属性。

大多数时候,您只需要知道对象内部是否有数据,而不是确切地知道它是否属于特定类型:

function notUndef (aux) {
 return aux !== undefined;
}

if (firstPost && notUndef(firstPost.active) && notUdenf(firstPost.message) && notUndef(firstPost.maxHeight))

如果要检查的属性列表很长,可以使用循环:

function checkHasProps (obj, properties) {
  obj || return false; 
  var hasAll = true;
  properties.forEach(function (prop) {
    if (obj[prop] === undefined) {
      hasAll = false;
    }
  });
  return hasAll;
}

if (checkHasProps(['active', 'message', 'maxHeight', (...)]));

请记住,typeof [] === 'object'typeof不是一种完全可靠的检查方式。

于 2013-07-24T09:05:10.103 回答
0

循环对象或使用其他方式将具有比您编写的更多的代码。当然你可以使用“||” 在 javascript 中比较的方法或“?:” if else 语句的类型。

于 2013-07-24T08:43:55.417 回答