【问题标题】:ensure undefined in accessing object don't break the enitre app确保在访问对象时未定义不会破坏整个应用程序
【发布时间】:2018-08-23 04:44:21
【问题描述】:

编写 js 应用的一个烦人的事情是嵌套对象会导致错误并破坏整个应用。

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

鉴于上面的代码,它可能很危险,如果 result.applicant._id 为空怎么办?那么 toString 将是无效的,因为它不能是 undefined.toString()。在这种情况下如何确保 toString() 工作?我可以的

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

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

【问题讨论】:

标签: javascript


【解决方案1】:

您的版本无需点击 undefined.toString() 就可以工作,因为 if 条件将被短路(短路?),因为 result.applicant._id === null 将评估为 true 并且永远不会评估 applicant_id !== result.applicant._id.toString()

测试已经完成,本例无需添加额外检查。

更新刚刚意识到===undefined 不匹配。

只需将第一部分更改为result.applicant._id == null,它将匹配undefinednull

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

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

【讨论】:

  • 更新答案:)
  • 我知道 linter 会抱怨使用 == 但这样做仍然有效,并且是这样做的“最佳”方式。我只在需要时使用==,并且倾向于留下评论,以防其他人出现并决定他们想要取消警告。
  • @JamieAden 在这种情况下同样的问题:“如果申请人不存在,这也会引发错误”
【解决方案2】:

稍加处理可能会为您提供所需的更简洁的代码。 只要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' 为真。 12 === '12' 是假的。一般来说,建议是使用===,除非你有意识地想要利用强制,这似乎是一个很好的例子:)

【讨论】:

  • 使用== 不安全,我想避免这种情况。
  • 只要您了解它与=== 相比的工作方式差异,它就不是不安全的。它实际上在 JavaScript 中有一个非常特定的用途,但它可能会被来自其他语言的程序员混淆,其中== 是默认运算符。强制是 JavaScript 的一个特性,只要我们在有意义且有意的地方使用它:)
【解决方案3】:

? 最短的方法可能是这样的:

.:已更新:.

const applicant = result.applicant || {}
if (applicant_id !== `${applicant._id}`) {
  console.log('redirect user');
}

【讨论】:

  • 如果申请者不存在也会报错
  • @JamieAden 在这种情况下我们需要添加const applicant = result.applicant || {}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-20
  • 1970-01-01
  • 2014-10-10
  • 2021-10-17
  • 1970-01-01
  • 2019-03-01
相关资源
最近更新 更多