我最近试图深入了解ReactJS和Redux在何时更新钩子方面的工作方式。
考虑一下我所做的游戏:
let state = { a: 1 };
//action happens, but no change
//comparison
const prevState = state;
state = state;
const nextState = state;
const equal = prevState === nextState ? "Yes" : "No";
console.log("Action - no change. Are they equal?", equal);
上面的例子很简单,都指向同一个对象。
请参阅下一个示例:
let state = { a: 1 };
//action happens, change in state
//comparison
const prevState = state;
state = { ...state, b: 2 };
const nextState = state;
const equal = prevState === nextState ? "Yes" : "No";
console.log("Action - no change. Are they equal?", equal);
虽然现在比较如何对钩子起作用是有意义的,但不完全是为什么。
我们正在改变状态,对象本身,但无论它得到什么值正确,它都是相同的引用?那么我理解错了什么呢?对象引用是值和/或声明?
我们正在改变状态,对象本身,
不,该代码不是。 具体说来
state = { ...state, b: 2 };
分配一个新的、引用不同的对象,该对象使用来自state
的上一个引用的属性进行初始化。
该行不会更改对象本身;它为单元格state
分配不同的对象引用。
要更改状态的内容,您可以执行
state.b = 2;
只要state.b
引用的属性不作为自己的属性存在、可配置的或原型链上有 setter 即可工作。
您正在尝试比较两个不同的对象引用。 在Javascript中,===
比较它们是否是完全相同的对象(意味着内存中的相同位置(。
您在第二个示例中执行的等效操作
const obj1 = {a: 1};
const obj2 = {a: 1};
obj1 === obj2; // False
它们永远不会相等,因为它们驻留在内存中的两个不同位置。
您可以在此处阅读更多相关信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness#Strict_equality_using