Javascript用“;typeof“;没有“;如果“;

Javascript Control many types with "typeof" without "if"

本文关键字:如果 没有 typeof Javascript      更新时间:2023-09-26

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

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,则可以将其封装在函数中。否则,我认为你的if构造是你唯一真正的可能性。当然,您可以创建一个以键为字段名、以值为必需类型的对象,但我不会这么做,因为它将不再易于阅读。

我脑海中唯一能缩短这段代码的是将函数类型包装成这样的东西:

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

因此,您可以将其称为is(firstPost, 'object'),依此类推

循环对象或使用其他方式将拥有比您编写的更多的代码。当然,您可以使用"||"方法在javascript或"?:"if-else语句中进行比较。

第一次检查可以简化,因为对象实例是truthy !!{} === 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不是一种完全可靠的检查方法。