Javascript 确保在访问对象don'时未定义;不要破坏enitre应用程序

Javascript 确保在访问对象don'时未定义;不要破坏enitre应用程序,javascript,Javascript,编写js应用程序的一个恼人之处是嵌套对象可能会导致错误并破坏整个应用程序 if(result.applicant._id === null || applicant_id !== result.applicant._id.toString()){ console.log('redirect user'); } 鉴于上述代码,它可能是危险的,如果result.applicator.\u id为空怎么办?那么toString将无效,因为它不能未定义。toString()。在这种情况下,如何确保to

编写js应用程序的一个恼人之处是嵌套对象可能会导致错误并破坏整个应用程序

if(result.applicant._id === null || applicant_id !== result.applicant._id.toString()){
console.log('redirect user');
}

鉴于上述代码,它可能是危险的,如果result.applicator.\u id为空怎么办?那么toString将无效,因为它不能未定义。toString()。在这种情况下,如何确保toString()工作?我能行

if(result.applicant._id === null || applicant_id !== (result.applicant._id && result.applicant._id.toString())){}

但那太不干净了。我发现我会有很多复制,只是为了使用js检查存在的东西。

您的版本工作时不会碰到
未定义的.toString()
,因为if条件将短路(短路?)作为
result.applicator.\u id==null
将评估为true,并且从不评估
applicator\u id!==result.applicator.\u id.toString()


测试已经完成,在这种情况下不需要添加额外的检查


更新刚刚意识到
==
与未定义的
不匹配


只需将第一部分更改为
result.applicator.\u id==null
,它将匹配
undefined
null

if (result.applicant._id == null || applicant_id !== result.applicant._id.toString()){
    console.log('redirect user');
}

我知道您可能会以linting警告结束,但在这种情况下,这正是您想要的。

一点简短的处理可能会为您提供更清晰的代码。 只要
0
不是有效的应用程序id:

const id = result.application._id || 0;
if(!id || applicant_id !== id.toString()){
  // redirect
}

编辑:解释-变量声明中的
|
将值分配给第一个
truthy
值或第二个值。因此,如果该值未定义,它将下降到第二个值(
0
),该值仍然是错误的,并且将无法通过检查,但仍然可以对其调用
.toString()


编辑2:如果您的ID只是数字(看起来就是这样),那么您实际上不需要将其转换为字符串-只需使用
让JavaScript强制您使用=而不是
==

const id = result.application._id || 0;
if(!id || applicant_id != id){
 // redirect
}

在JavaScript中,
12==“12”
为true<代码>12==“12”
为false。通常建议使用
=
,除非你有意识地想利用强制,这似乎是一个很好的例子:)

你试过使用
try{}catch(){}
表达式?可能重复更新答案的可能重复:)我知道linters会抱怨使用
=
,但这样做仍然有效,而且是“正确”的方法。我只在需要时使用
==
,并倾向于留下一条注释,说明这是为了防止其他人出现并决定取消警告。@JamieAden在这种情况下也会这样做:“如果申请者不存在,这也会引发一个错误”使用
==
是不安全的,我想避免这种情况。只要您了解它与
==
在工作方式上的差异,它就不是不安全的。它实际上在JavaScript中有一个非常特殊的用途,但是来自其他语言的程序员可能会混淆它,因为
==
是默认的操作符。强制是JavaScript的一个特性,只要我们在有意义和有意的地方使用它:)如果申请者不存在,这将抛出一个错误too@JamieAden在这种情况下,我们需要添加
const applicator=result.applicator | |{}