Javascript 检查JS可选属性是否存在的最有效(或最具风格)方法?

Javascript 检查JS可选属性是否存在的最有效(或最具风格)方法?,javascript,coding-style,Javascript,Coding Style,考虑一个对象,user: user = { profile: { first_name: "Arthur", last_name: "Dent" }, planet: "Earth" } 检查是否存在user.profile.first\u name的最佳方法是什么? 我通常会使用(!!user&&!!user.profile&&!!user.profile.first_name),但这不可能是最好的方法(特别是在较长的情况下,属性嵌套

考虑一个对象,
user

user = {
    profile: {
        first_name: "Arthur",
        last_name:  "Dent"
    },
    planet: "Earth"
}
检查是否存在
user.profile.first\u name
的最佳方法是什么?

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

好奇这是怎么习惯性地做的

<强> [编辑] < /强>考虑,为了论证,您需要检查<代码>用户的存在。jordan。Prime.Fab利多。颜色< /COD>(故意长而笨拙),在那里您不能确定任何单个属性的存在。(因此,

users.jordan
可能存在,但
users.jordan.profile
不存在。)


诚然,这可能是代码中存在更普遍问题的迹象(例如,除非填充了所有可能的属性,否则不应创建对象),但有时这是没有帮助的。

我会使用
try catch
块:

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

您可以使用中的
检查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!');
}

我不喜欢这个问题,很难表达为什么,好奇是否有人知道为什么?我不特别喜欢问这个问题,因为这似乎是一个非常主观的问题……但这是我几乎每天都在使用的问题,也是我与同事和朋友谈过的问题。对,这取决于情况,你在乎它是否存在吗ts与否。您对它的存在有多大信心,等等。我们都应该知道如何检查它,因此很难验证和回答。将它移动到meta或其他位置。我不会,如果它不存在,我会抛出一个错误。如果有那么重要。@WhiteHat它取决于不存在的属性的语义。例如,
user.favorite.color
notexisting可能不是
Exception
al。(虽然可能是为了良好的代码约定,它应该设置为某物…)你必须触摸它,检查它。为了检查
user.profile.first_name
,你仍然必须检查
profile
,然后独立地检查
first_name
,不是吗?这可能是一种比
!!
布尔强制方法更好的检查方法(即
!!
破坏虚假但现存的值)但是这绝对是冗长的。考虑四或五个嵌套级别的边缘情况。这里有一个更深入的答案:我只喜欢更冗长的方法,通常在3-4个深嵌套值之后,可以简化一些事情。