Javascript 纯函数:状态内容与状态引用

Javascript 纯函数:状态内容与状态引用,javascript,arrays,react-redux,Javascript,Arrays,React Redux,,我很难理解为什么在新创建的const(第24行)上使用push函数时,使用spread操作符还是简单地复制“state”很重要。将[…状态]替换为状态如何导致状态被新闻状态的内容覆盖 如果将状态直接传递给newState,则会覆盖对状态的引用,这一假设是否正确?也就是说,在const newState=state的情况下,像这样使用排列运算符将从状态获取所有项,并使用这些项创建一个新数组。因此state和newState将引用不同的数组(这些数组具有相同的元素,因此如果其中一个元素是对象,并且

,我很难理解为什么在新创建的const(第24行)上使用push函数时,使用spread操作符还是简单地复制“state”很重要。将
[…状态]
替换为
状态
如何导致
状态
新闻状态
的内容覆盖


如果将状态直接传递给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
都发生了更改。

值得一提的是,复制数组时,扩展语法只深入了一层。如果你有更深的层次,你所谓的“复制”只会引用它们,而不是真正的复制。值得一提的是,复制数组时,排列语法只会深入一层。如果你有更深的层次,你所谓的“副本”将只引用它们,而不是真正的副本。同样好,如果可能的话,将标记为答案,谢谢!同样好,如果两个都可以的话,我会把它作为答案,谢谢!