【问题标题】:Most efficient (or most stylistic) way of checking for existence of JS optional attributes?检查 JS 可选属性是否存在的最有效(或最具风格)的方法?
【发布时间】:2015-08-08 00:51:12
【问题描述】:

考虑一个对象,user

user = {
    profile: {
        first_name: "Arthur",
        last_name:  "Dent"
    },
    planet: "Earth"
}

检查user.profile.first_name是否存在的最佳方法是什么?

我通常会使用(!!user && !!user.profile && !!user.profile.first_name),但这可能不是最好的方法(尤其是在较长的情况下,属性嵌套更深)。

好奇这是怎么做的!

[编辑] 考虑一下,为了争论,你需要检查 users.jordan.profile.favorites.color 的存在(故意冗长而笨拙),你不能确定任何个人的存在属性(所以可能users.jordan 存在但users.jordan.profile 不存在。)

当然,这可能表明代码中存在更普遍的问题(例如,除非填充了所有可能的属性,否则不应创建对象),但有时这无济于事。

【问题讨论】:

  • 我不喜欢这个问题,也很难说清楚为什么,好奇有没有人知道为什么?
  • 我不是特别喜欢问这个问题,因为这似乎是一个非常主观的问题......但这是我几乎每天都在使用的东西,也是我与同事和朋友谈论过的东西.
  • 对,所以看情况,你在乎它是否存在。您对它的存在有多大信心等等。我们都应该知道如何检查它,因此很难验证和回答。将其移至 meta 或某处。

标签: javascript coding-style


【解决方案1】:

您可以使用in 在 if 语句中检查属性。

if ('profile' in user) {
    alert('I have a profile!');
}

如果您需要检查嵌套值,请查看该属性:

if ('first_name' in user.profile) {
    alert('I have a first name!');
}

您也可以使用.hasOwnProperty()

if (user.hasOwnProperty('profile') {
    alert('I have a profile!');
}

【讨论】:

  • 你必须触摸它,才能检查它。
  • 为了检查user.profile.first_name,您仍然必须独立检查profile,然后检查first_name,不是吗?这可能是比!! boolean-coerce 方法更好的检查方法(即!! 打破虚假但现存的值),但它绝对是非常冗长的。考虑四层或五层嵌套的边缘情况!
  • 这里有一个更深入的答案:stackoverflow.com/questions/2631001/… 我只是更喜欢更冗长的方法,通常在 3-4 个深度嵌套值之后,可以简化一些事情。
【解决方案2】:

我会使用try catch 块:

try { fname = user.profile.first_name } catch(e) { fname = false }
if (fname) ...

【讨论】:

  • 我不会,如果它不存在我会抛出一个错误。如果它那么重要。
  • @WhiteHat 它取决于不存在的属性的语义含义。例如,user.favorite.color 不存在可能不是Exceptional。 (虽然可能为了良好的代码约定,它应该设置为 something...)
猜你喜欢
  • 1970-01-01
  • 2011-12-10
  • 2018-03-07
  • 2019-08-06
  • 1970-01-01
  • 1970-01-01
  • 2012-04-02
  • 2020-03-23
  • 2011-01-04
相关资源
最近更新 更多