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.