如何缩短类型的表达?

时间:2019-06-07 10:10:08

标签: javascript

有时候,我必须检查许多存在和定义的变量。看起来像这样:

if (typeof store.part.items !== 'undefined' && 
  typeof domain !== 'undefined' && 
  typeof tab.partId !== 'undefined') 
{ 
  // do something useful 
}

编写这种结构很无聊,每次都需要大量敲击键盘,并且增加了出错的风险。如何解决这个问题?

4 个答案:

答案 0 :(得分:8)

您可以使用rest parameter syntax来收集作为数组传递给函数的所有参数。然后,使用every检查它们是否都是未定义

const defined = (...values) => values.every(v => typeof v !== "undefined")

或按照@Ry的建议使用includes

const defined = (...values) => !values.includes(undefined)

调用函数时,无需创建数组。您只需使用任意数量的参数即可调用它:

defined(store.part.items, domain, tab.partId)

答案 1 :(得分:1)

这是一个对我有很大帮助的小功能。

const defined = function (value) {
  const resFunc = (val) => typeof val !== 'undefined';

  if (Array.isArray(value)) {
    let res = true;

    value.forEach(el => res = res && resFunc(el));

    return res;
  }

  return resFunc(value);
}

现在我的代码看起来更开心和可读:

if (defined([store.part.items, domain, tab.partId])) {
  // do something useful
}

答案 2 :(得分:1)

使用arguments进行变量参数计数,使用简单的旧for循环并提前退出以提高性能来优化OP的自回答:

const defined = function(...arguments) {
  for (let i = 0; i < arguments.length; i++) {
    if (arguments[i] === undefined) return false;
  }
  return true;
};

// ...

if (defined(store.part.items, domain, tab.partId)) {
  // do something useful
}
if (defined(store.part.items) {
  // do something useful
}

答案 3 :(得分:1)

除了定义自己的函数(您已经做过)之外,没有捷径可做。我想改善您对该功能的实现。

  

defined(exprs: array<any> | any, all?: bool)

     

exprs —检查表达式是否未定义的表达式。    
   all-表达式是否必须相同。 [如果有用,exprs: array<any> ]

     
function defined(exprs, all=true) {
  if(Array.isArray(exprs)) {
     if(all)
        return exprs.every(exp => typeof exp !== "undefined");
     else
        return exprs.some(exp => typeof exp !== "undefined");
  }
  else
     typeof exprs !== "undefined";
}