单行条件操作

One-liner conditional operation

在 switch 语句的情况下,我多次具有以下条件结构。 (见箭头)

  switch (field.target.name) {
    case "email":
      if (!isEmail(field.target.value)) {  <-----------
        dispatch('has_error', field)       <-----------
      }                                    <-----------
      return                               <-----------
    case "phoneNumber":
    case "companyPhoneNumber":
      if (!isMobilePhone(field.target.value, 'en-CA')) {
        dispatch('has_error', field)
      }
      return
  }

我想缩短它,以免占用 4 行。我可以做类似

的事情
!isEmail(field.target.value) ? dispatch('has_error', field) : null
return

但这似乎很尴尬。

有什么优雅的解决方案吗?

这样做是有效的:

if (!isEmail(field.target.value)) return dispatch('has_error', field);

但有些人并不关心最终会持续多久。

您当前的代码可读性好。你可以写成

return !isEmail(field.target.value) && dispatch('has_error', field);

return isEmail(field.target.value) || dispatch('has_error', field);

这结合了两个 "techniques":

  1. 在与某些语句相同的行上使用 return,以便同时执行该语句,然后立即从函数中 return。然而,这可能会造成混淆——您的代码中的 reader 可能认为 return 值在某种程度上很重要。并且只有当该函数通常不期望 return 任何东西时它才有效。

  2. if (a) b写成a && b(或if (!a) b写成a || b)。但是这种编写等效于 if 语句的方法通常因过于简洁而不受欢迎——它隐藏了逻辑的基本 if 性质。此外,如果以 stand-alone 方式使用,如 a && b;,许多 linter 会(理所当然地)抱怨 stand-alone 表达式。

尝试下面的操作,如果isEmail(field.target.value)return falsedispatch('has_error', field)将被执行。

isEmail(field.target.value) || dispatch('has_error', field);
return;