JavaScript 中的对象引用比较



我最近试图深入了解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

相关内容

  • 没有找到相关文章

最新更新