Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.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 为什么当其他对象也被传入时,Object.assign({},…)使用空对象文本?_Javascript - Fatal编程技术网

Javascript 为什么当其他对象也被传入时,Object.assign({},…)使用空对象文本?

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 } ]

我正在阅读Redux reducers()的介绍,其中包含以下Redux reducer示例:

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);