In this pen,我很难理解为什么在新创建的const(第24行)上使用push函数时,重要的是使用扩展运算符还是只复制“状态”。如何用[...state]
替换state
会导致state
被newState
的内容覆盖?
我是否正确假设是引用表示如果状态直接传递给newState则会被覆盖?即在const newState = state
答案 0 :(得分:1)
使用这样的扩展运算符将从state
中获取所有项目,并使用这些项目创建一个新数组。因此state
和newState
将引用不同的数组(具有相同的元素,因此,如果其中一个元素是一个对象并且您更改了其中一个属性,则该更改将在另一个数组)。编写const newState = state
将导致一个数组和两个对该数组的引用,因为您没有在任何地方创建第二个数组。
答案 1 :(得分:1)
我认为这是你引用的部分或笔:
const newState = [...state]; // copy contents of state, NOT the reference to it (state)
newState.push(action.payload);
return newState;
让我们来看看这段代码现在正在做什么,以及如果使用const newState = state
会怎么做。
const newState = [...state];
此行创建一个名为newState
的新数组,其内容为state
。它基本上是一个衬垫:
const newState = [];
for (let i = 0; i < state.length; i++) {
newState.push(state[i]);
}
调用newState.push(action.payload)
时,state
数组不会更改,而newState
会有一个额外的元素。
const newState = state;
此行将变量newState
设置为与state
相同的引用,因此只有一个数组正在运行。
调用newState.push(action.payload)
时,新元素将被推送到数组中,因此newState
和state
都已更改。