对象销毁是通过引用进行的还是克隆对象

edd*_*ddy 4 javascript immutability ecmascript-6 reactjs

我需要复制一个对象this.state以更改其某些属性值。

例如,在以下方法中,状态被直接突变(this.state.errors = {}

   authorFormIsValid = () => {
    var formIsValid = true;
    this.state.errors = {}; //clear any previous errors.

    if (this.state.author.firstName.length < 3) {
      this.state.errors.firstName = 'First name must be at least 3 characters.';
      formIsValid = false;
    }

    if (this.state.author.lastName.length < 3) {
      this.state.errors.lastName = 'Last name must be at least 3 characters.';
      formIsValid = false;
    }

    this.setState({errors: this.state.errors});
    return formIsValid;
  };
Run Code Online (Sandbox Code Playgroud)

为了避免这种情况,我知道我们可以使用:

a)对象传播算子

let errors={...this.state.errors};
Run Code Online (Sandbox Code Playgroud)

b)或Object.assign

let errors=Object.assign({},this.state.errors);
Run Code Online (Sandbox Code Playgroud)

但是有时我似乎在一些示例中object destructuring使用了这样的示例:

authorFormIsValid = () => {
    let formIsValid = true;

   //Destructuring error and authors from this.state
    let {errors, author} = this.state;

    errors = {}; //clear any previous errors.

    if (author.firstName.length < 3) {
      errors.firstName = 'First name must be at least 3 characters.';
      formIsValid = false;
    }

    if (author.lastName.length < 3) {
      errors.lastName = 'Last name must be at least 3 characters.';
      formIsValid = false;
    }

    this.setState({errors});
    return formIsValid;
  };
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,它是否object destructuring等同于上述其他两种方法?我的意思是,我会避免通过使用simple直接改变状态object destructuring吗?

Shu*_*tri 5

Object destructuring起作用reference,因此您不应该在对其进行销毁后对其进行变异。所以的做法

let {errors, author} = this.state;

errors = {}; //clear any previous errors.
Run Code Online (Sandbox Code Playgroud)

实际上是错误的。

请参阅下面的参考电话摘录

let {errors, author} = this.state;

errors = {}; //clear any previous errors.
Run Code Online (Sandbox Code Playgroud)