我想知道是否有经典的替代品。
if (typeof firstPost === 'object' && typeof firstPost.active === 'boolean' && typeof firstPost.message === 'string' && typeof firstPost.maxHeight)
以免编写更多代码,可能循环对象。
我想知道是否有经典的替代品。
if (typeof firstPost === 'object' && typeof firstPost.active === 'boolean' && typeof firstPost.message === 'string' && typeof firstPost.maxHeight)
以免编写更多代码,可能循环对象。
我会用这个:
如果这是用户输入
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'
});
您可以详细说明另一种返回类型以指定错误。
如果总是有相同的类型,并且您更频繁地需要这个确切的类型,您可以将它包装在一个函数中。否则,我认为您的 if 构造是您唯一真正的可能性。当然,您可以创建一个对象,其中键为字段名,值作为所需类型,但我不会这样做,因为它不再易于阅读。
我想到的唯一会缩短这段代码(一点点)的事情是将 typeof 函数包装成这样的东西:
function is(variable, type){
return typeof variable == type;
}
所以你可以这样称呼它is(firstPost, 'object')
等等
第一个检查可以简化,因为对象实例是真实的!!{} === 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
不是一种完全可靠的检查方式。
循环对象或使用其他方式将具有比您编写的更多的代码。当然你可以使用“||” 在 javascript 中比较的方法或“?:” if else 语句的类型。