Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 对象破坏是通过引用工作还是克隆对象_Javascript_Reactjs_Ecmascript 6_Immutability - Fatal编程技术网

Javascript 对象破坏是通过引用工作还是克隆对象

Javascript 对象破坏是通过引用工作还是克隆对象,javascript,reactjs,ecmascript-6,immutability,Javascript,Reactjs,Ecmascript 6,Immutability,我需要从this.state复制一个对象以更改其某些属性值 例如,在以下方法中,状态被直接变异(this.state.errors={}) b) 或 但有时我会看到一些例子,其中对象解构是这样使用的: authorFormIsValid = () => { let formIsValid = true; //Destructuring error and authors from this.state let {errors, author} = this.stat

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

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

b) 或

但有时我会看到一些例子,其中
对象解构
是这样使用的:

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;
  };
authorFormIsValid=()=>{
让formIsValid=true;
//从此.state中解析结构错误和作者
设{errors,author}=this.state;
errors={};//清除以前的所有错误。
if(author.firstName.length<3){
errors.firstName='名字必须至少包含3个字符';
formIsValid=false;
}
if(author.lastName.length<3){
errors.lastName='姓氏必须至少包含3个字符';
formIsValid=false;
}
this.setState({errors});
返回formIsValid;
};

所以我的问题是,它是否等同于上面提到的另外两种方法?我的意思是,我是否可以通过使用简单的
对象解构来避免直接改变状态?

否。对象解构只是将“this.state”中的相同对象分配给不同的变量

let {errors, author} = this.state;
因此,新的
error
变量引用了
this.state

但是,下一行
errors={}
不会使
此.state发生变异。它仅将
error
变量重新引用到新的空对象。所以给定的代码仍然没有进行状态变异。事实上,在这个对象的解构中,有
error
没有任何意义。它类似于这样的东西

let errors = this.state.errors;
errors = {};
基本上与此没有区别

let errors = {};

Object destructuring
通过
reference
工作,因此在对对象进行分解后不应对其进行变异。那么

let {errors, author} = this.state;

errors = {}; //clear any previous errors.
这实际上是错误的

请参阅下面的引用调用片段

让obj={
傅:{
酒吧:1
}
}
设{foo}=obj;
console.log(foo.bar);//1.
console.log(obj.foo.bar);//1.
foo.bar++;
console.log(foo.bar);//2.

console.log(obj.foo.bar);//2
Yes在那一行中仍然没有突变,但是下面几行呢:
this.state.errors.firstName='名字必须至少包含3个字符'?这是一种状态突变。前一行也是,
this.state.errors={}
等等!您是否试图说明直接将状态赋值给变量没有错,请修改该变量,然后在
this.setState()
中使用该变量?不,这是错的。但是
error={}
不是一个修改变量。这是一次重新分配。修改变量是这样的<代码>错误。名字='名字…
。这是有区别的。所以我想我必须坚持使用object spread运算符或object.assign,对吗?是的,我建议您使用spread运算符,因为redux文档也推荐它。看到这个答案了吗
let errors = this.state.errors;
errors = {};
let errors = {};
let {errors, author} = this.state;

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