【问题标题】:Is there a better way to check if a variable exists in Javascript? [duplicate]有没有更好的方法来检查 Javascript 中是否存在变量? [复制]
【发布时间】:2019-07-09 23:14:50
【问题描述】:

目前我(在项目的许多地方)检查数据是否存在于一个对象的根级别,只是为了查看下一层是否存在,只是为了查看下一层等等。

这可能看起来像这样:

let name = display.data ? display.data ? data.name.bio ? data.name.bio.details ? :"Name N/A" : "Name N/A" : "Name N/A" : "Name N/A"

有没有一种方法可以直接调用data.name.bio.details,而不是通过这种方式进行检查,这不会引发错误,但会默默地退回到未定义状态?

例如如果我打电话给data.name.bio.details 并且data.name.bio 不存在,我会收到一个错误提示,而且它不是那么安静。

我可以做这样的事情吗?当 .bio 不存在时,不会尖叫血腥谋杀?:

var name = data.name.bio.details || "Name N/A"

希望这是有道理的,不确定是否有更好的方法!

【问题讨论】:

  • 如果对象存在并且它是一个对象属性,你可以像if(obj.prop === undefined){ /* not defined */}那样做。如果 var 是一个参数或使用 varletconst 声明,您也可以简单地测试 === undefined。如果没有任何声明,您应该像if(typeof yourVar === 'undefined'){ /* not defined */ } 那样做。最后一种方式适用于所有情况。当然,请注意,如果您的对象未定义,那么 if(typeof obj.prop === 'undefined'){} 会在 obj 上抛出未定义的错误。

标签: javascript reactjs object


【解决方案1】:

使用逻辑 AND && 和 OR ||

var name = data && data.name && data.name.bio && data.name.bio.details || "Name N/A";

如果您不确定 data 是否已定义,您也可以使用 try/catch - 如果 data 未定义,上述将引发 ReferenceError:

try {
  var name = data.name.bios.details;
} catch(e) {
  var name = "Name N/A";
}

【讨论】:

  • 是的,我想这对一堆后备/错误案例是正确的
  • 注意,这需要至少定义数据。
  • 它有效,但 try-catch 是一个密集的过程。老实说,我很想将 try-catch 与内联检查进行基准测试并查看差异。
  • 不应该,但我也不同意在这种情况下使用 try-catch 进行简单的空检查。这对我来说似乎很懒惰(个人意见)。
  • AND / OR 方法并不比问题中的原始解决方案更好
【解决方案2】:

如果您要编译代码,请查看tc39/proposal-optional-chaining

有一个 Babel 插件可以为你处理它。

var name = data?.name?.bio?.details || "Name N/A"

显然这还不能按原样工作,但如果您已经在使用 Babel(或类似的),则值得考虑!

【讨论】:

  • 我只希望这在标准 JS 中是可能的。我想念 C# 中的 nullables
  • 我们有一天会到达那里的朋友。这几乎肯定会成为标准,只是需要一些时间......
  • 这太棒了,一定是愿望清单。
【解决方案3】:

老实说,我的路线和其他路线相似,但我更喜欢这条路线。

编辑:

我正在考虑另一种方法来让它不那么啰嗦,我到了这个。

((typeof data != 'undefined') ? data.name && data.name.bio && data.name.bio.details && data.name.bio.details || "Name NA" : "Name NA")

它会对数据执行一个空值检查,然后它会使用另一种方法进行评估(老实说我忘记了它叫什么),然后它会返回适当的值。

编辑:修复了在 Edge 中失败的问题。在 Edge、Chrome 和 Firefox 中测试。也去掉了第一种方法。

【讨论】:

  • 可以从x && x.y && x.y.z.. 开始:三元位置看起来没有什么价值:也许是条件下?对于x && x.str && x.str.length 的边缘情况,这种情况“可能会失败” .. 只是为了保持真实性规则。
  • 你是对的。我以前从未意识到这一点。如何在 Edge 上检查变量是否为空或未定义?我已经完成了所有的标准检查,但每个检查都失败了。请告诉我这不是一个尝试捕捉。编辑:找到了。
【解决方案4】:

!!你的变量 上面将检查 yourVar 是否为空、未定义、非空等...

【讨论】:

  • 如果例如 bio 不存在于:!!data.name.bio.details 中会尖叫吗?
猜你喜欢
  • 2011-02-19
  • 2014-10-23
  • 2015-03-06
  • 1970-01-01
  • 2019-11-26
  • 2016-10-28
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多