Javascript 纯函数:状态内容与状态引用
,我很难理解为什么在新创建的const(第24行)上使用push函数时,使用spread操作符还是简单地复制“state”很重要。将Javascript 纯函数:状态内容与状态引用,javascript,arrays,react-redux,Javascript,Arrays,React Redux,,我很难理解为什么在新创建的const(第24行)上使用push函数时,使用spread操作符还是简单地复制“state”很重要。将[…状态]替换为状态如何导致状态被新闻状态的内容覆盖 如果将状态直接传递给newState,则会覆盖对状态的引用,这一假设是否正确?也就是说,在const newState=state的情况下,像这样使用排列运算符将从状态获取所有项,并使用这些项创建一个新数组。因此state和newState将引用不同的数组(这些数组具有相同的元素,因此如果其中一个元素是对象,并且
[…状态]
替换为状态
如何导致状态
被新闻状态
的内容覆盖
如果将状态直接传递给newState,则会覆盖对状态的引用,这一假设是否正确?也就是说,在
const newState=state
的情况下,像这样使用排列运算符将从状态
获取所有项,并使用这些项创建一个新数组。因此state
和newState
将引用不同的数组(这些数组具有相同的元素,因此如果其中一个元素是对象,并且您更改了它的一个属性,则该更改将在另一个数组中可见)。写入const newState=state
将产生一个数组和对该数组的两个引用,因为您不会在任何地方创建第二个数组。像这样使用spread操作符将从state
获取所有项,并使用这些项创建一个新数组。因此state
和newState
将引用不同的数组(这些数组具有相同的元素,因此如果其中一个元素是对象,并且您更改了它的一个属性,则该更改将在另一个数组中可见)。写入const newState=state
将导致一个数组和对该数组的两个引用,因为您没有在任何地方创建第二个数组。我假定这是您正在引用的节或笔:
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
设置为与state
相同的引用,因此只有一个数组可用
调用
newState.push(action.payload)
时,新元素被推入数组中,因此newState
和state
都已更改。我假定这是您引用的节或笔:
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
设置为与state
相同的引用,因此只有一个数组可用
调用
newState.push(action.payload)
时,新元素被推入数组中,因此newState
和state
都发生了更改。值得一提的是,复制数组时,扩展语法只深入了一层。如果你有更深的层次,你所谓的“复制”只会引用它们,而不是真正的复制。值得一提的是,复制数组时,排列语法只会深入一层。如果你有更深的层次,你所谓的“副本”将只引用它们,而不是真正的副本。同样好,如果可能的话,将标记为答案,谢谢!同样好,如果两个都可以的话,我会把它作为答案,谢谢!