更好地检查JavaScript变量的完整性

Better sanity check for JavaScript variable

本文关键字:完整性 变量 JavaScript 检查 更好      更新时间:2023-09-26

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

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

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是一种合理的或预期的做事方式,提议的重构是否有意义?或者我没有创造任何显著的效率?

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

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

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

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

来使其明显。

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

这是你的函数的清理版本:

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

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

是的。

提议的重构有意义吗?

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

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

注意:typeof不是一个函数,它是一个运算符

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

那么,给定某种标志对象:

flags = {
  appStarted: true,
  userAuthenticated: true
}

我可能需要看看用户是否做了什么。我可以将对象初始化为具有thingDone: false,然后在条件中检查是否为真;或者我可以简单地不初始化默认值,并检查它是否已设置:

if (flags.hasOwnProperty("thingDone")

这个答案超出了原来问题的范围(这是专门关于检查变量的),但它可能对那些本来会检查if(typeof flags.thingDone === "undefined")的人有用。这是一件事的六件事,但我个人认为这在语义上更有意义。