在JavaScript中返回不带突变的对象

时间:2018-08-20 02:37:52

标签: javascript reactjs

以下功能是否相同?我以redux形式使用它,因为我的表单只是一个字段,我想我不需要循环,但是第二个字段的行为不一样,我想知道为什么

//working
export default values => {
  let errors = {}
  ;['email'].forEach(field => {
    if (!values.email) {
      errors.email = `Email cannot be empty.`
    }
  })
  return errors
}

//is this the same as the above?
export default values => {
  if (!values.email) {
    return {
      errors: {
        email: `Email cannot be empty.`
      }
    }
  }
}

1 个答案:

答案 0 :(得分:0)

这两个功能 在功能上不相同。

您的第一个函数始终返回一个对象:

export default values => {
  let errors = {} // this errors object is always returned, regardless
                  // of the validity of fields
  ;['email'].forEach(field => {
    if (!values.email) {
      errors.email = `Email cannot be empty.`
    }
  })
  return errors // Object always gets returned
}

您的第二个功能,仅在values.email为假时返回对象

export default values => {
  if (!values.email) {
    // Result only returned if !values.email
    return {
      errors: {
        email: `Email cannot be empty.`
      }
    }
  }
  // If values.email is "truthy", then undefined is returned
}

总而言之,如果values.email为假,则第二个函数返回定义的结果,如果values.email为真,则第二个函数返回定义的结果,这与您的第一个函数不同,后者在所有情况下都返回定义的结果。 / p>

您可以考虑对第二个功能进行以下更改,以使其行为与第一个功能相似:

export default values => {
  if (!values.email) {
    return {
      errors: {
        email: `Email cannot be empty.`
      }
    }
  }
  // If values.email is "truthy", then return empty error object
  return {}
}