Javascript 为什么当其他对象也被传入时,Object.assign({},…)使用空对象文本?
我正在阅读Redux reducers()的介绍,其中包含以下Redux reducer示例:Javascript 为什么当其他对象也被传入时,Object.assign({},…)使用空对象文本?,javascript,Javascript,我正在阅读Redux reducers()的介绍,其中包含以下Redux reducer示例: function todos(state = [], action) { switch (action.type) { case 'ADD_TODO': return [ ...state, { text: action.text, completed: false } ]
function todos(state = [], action) {
switch (action.type) {
case 'ADD_TODO':
return [
...state,
{
text: action.text,
completed: false
}
]
case 'COMPLETE_TODO':
return state.map((todo, index) => {
if (index === action.index) {
return Object.assign({}, todo, {
completed: true
})
}
return todo
})
default:
return state
}
}
从它的文档()中可以看出,
Object.assign()
将“合并”传入它的所有对象。但是,在本例中,todo
和{completed:true}
已经是对象,因此我不认为将空对象文本{}
作为对象.assign()的第一个参数传递有什么意义。有人能澄清这一点吗?如果您没有传入空对象,原始的todo
对象将被修改。这可能是你想要的,但往往不是
这是由于对象是所有引用的方式,默认情况下不会克隆。当您使用对象。分配时,您给它的第一个对象将合并所有其他对象。也就是说,第一个对象将发生变异
如果要避免对正在合并的对象进行变异,最好将空对象作为第一个参数传入,以防止任何组件对象发生更改
下面是一个示例,演示了这种差异:
const obj1={
傅:“酒吧”
}
常数obj2={
关键词:“价值”
}
//这里,obj1在Object.assign调用之后是相同的
log(Object.assign({},obj1,obj2));
控制台日志(obj1)
console.log(obj2)
console.log(“\n\n”)
//请注意,在该调用之后,obj1保留两个键。因此,这将使其发生变异:
console.log(Object.assign(obj1,obj2));
console.log(obj1)//现在不同了
console.log(obj2)
简短回答:对象和数组是通过引用分配的
在本例中,更改一个将更改另一个,它们不是不变的:
let x = {param:1}
const foo = (a) => {
a.param +=1;
console.log('response', x, a)
}
foo(x);
为了解决这个问题,我们使用Object.assign()
由于完全不了解Redux,我认为这是为了避免改变原始对象并返回新对象。
let x = {param:1}
const foo = (a) => {
let b = Object.assign({}, a);
b.param +=1;
console.log('response', b, x)
}
foo(x);