更好地检查JavaScript变量

时间:2015-08-19 22:23:37

标签: javascript

所以,我有一个模块化组件......这意味着它可能出现在多个应用程序中。这些都是内部的,因此当我们添加更多产品时,组件的行为可以“增长”。

总的来说,可能有更好的设计来完成我想要完成的任务,但为了快速开发,我这样做:

function someFunc(opt) {
  if(typeof(taEnvironment) !== "undefined")) {
    if(taEnvironment === "webApp") {
      // do stuff when a variable taEnvironment exists and its value is "webapp"
    }
  }
}

每次我需要检查“webApp”时这样做很麻烦,所以我想把它抽象一点点。建议的重构看起来有点像这样:

function someFunc(opt) {
  if(environment("webApp")) {
      // do stuff when a variable taEnvironment exists and its value is "webapp"
  }
}

//...elsewhere in the same module...
function environment(env) {
  var envSet = false;
  if(typeof(env) === "undefined") {
    return envSet;
  }
  if(typeof(taEnvironment) !== "undefined")) {
    if(taEnvironment === env) {
      envSet = true;
  }
  return envSet;
}

两部分问题:

  1. 即使只是查看第一个未重构的片段;这是检查这些变量的常用方法吗?您不能将typeof检查与值检查结合使用,因为如果它未定义,您将在值检查中失败。所以首先我检查typeof为“undefined”,然后嵌套在里面,我检查值。它看起来像是这样做的唯一方法,但如果有更好的模式,我就全都听见了!

  2. 根据#1的答案 - 如果#1是合理的或预期的做事方式,那么拟议的重构是否有意义?或者我没有创造任何显着的效率?

4 个答案:

答案 0 :(得分:3)

您可以同时检查所有条件。 &&运算符将停在第一个false结果:

function environment(env) {
    return typeof taEnvironment !== 'undefined' &&
           taEnvironment === env;
}

答案 1 :(得分:2)

这是有道理的,尽管你可以采取一些步骤,让后代更容易。

当可重用函数返回布尔值时,您可以通过将函数置于问题形式(例如isEnvironment(x)而不仅仅是模糊的environment(x)

中来表明这一点。

您还可以通过返回条件taEnvironment === env的评估而不是设置变量然后返回该变量来简化函数本身。

这是您的功能的清理版本:

function isEnvironment(env) {
  if(typeof taEnvironment === "undefined") {
    return false;
  }else{
    return taEnvironment === env; 
  }
}

答案 2 :(得分:1)

  

这是检查这些变量的常用方法吗?

是的。

  

拟议的重构是否有意义?

是。您也可以使用try...catch,但这完全取决于您:

function environment(env) {
  try {
    return typeof env !== 'undefined' && taEnvironment === env;
  } catch (e) {
    return false;
  }
}

注意:typeof不是函数,而是操作符。

答案 3 :(得分:0)

当"变量"时,我最近也从hasOwnProperty获得了里程数。我想检查一个离散变量本身,但它是一个对象的预期属性。

所以,给定某种标志对象:

flags = {
  appStarted: true,
  userAuthenticated: true
}

我可能需要查看用户是否做了某些事情。我可以将对象初始化为thingDone: false,然后在条件中检查真相;或者我不能用默认值初始化并检查它是否已设置:

if (flags.hasOwnProperty("thingDone")

这个答案超出了原始问题的范围(具体是关于检查变量),但对于本来可以检查if(typeof flags.thingDone === "undefined")的人来说,这可能是有用的。它是另外六个中的六个(即同一个东西),但我发现它在语义上更有意义。您的里程可能会有所不同。

相关问题