Redux网站上有一篇关于重新 Select 图书馆的 Select 器备忘录的文章,其中提供了下一个例子:

const state = {
  a: {
    first: 5
  },
  b: 10
}

const selectA = state => state.a
const selectB = state => state.b

const selectA1 = createSelector([selectA], a => a.first)

const selectResult = createSelector([selectA1, selectB], (a1, b) => {
  console.log('Output selector running')
  return a1 + b
})

const result = selectResult(state)
// Log: "Output selector running"
console.log(result)
// 15

const secondResult = selectResult(state)
// No log output
console.log(secondResult)
// 15

总体而言,这个例子很清楚,除了selectA1 Select 器. Redux Docs表示

当您调用 Select 器时,Reselect将使用您给出的所有参数运行您的输入 Select 器,并查看返回值.如果任何结果=与以前不同,它将重新运行输出 Select 器,并将这些结果作为参数传递.

所以,如果我们提供state.a,这是对象,作为selectA1的输入 Select 器,它将不通过===判断,并每次运行a => a.first,对吗?还是我误解了什么?

推荐答案

因此,如果我们提供state.a作为对象,作为的输入 Select 器 selectA1,则每次===判断失败并运行a => a.first, 对吗?

不,对象引用100将严格等于其自身.

selectA Select 器函数返回state.a,这是对值为{ first: 5 }的对象的引用.state.a将继续到106是对107对象的引用,直到将动作分派到更新state.a,然后是对具有值的108对象的引用,then,selectA1 Select 器函数将重新计算其输出值.

我希望这段代码有助于说明对象引用相等性.

const state = {
  a: { first: 5 },
};

const selectA = state => state.a;

// same reference, true
console.log(selectA(state) === state.a);

// same "value", but false because different reference
console.log({ first: 5 } === state.a);

Javascript相关问答推荐

如何修复内容安全策略指令脚本-SRC自身错误?

materialized - activeIndex返回-1

在React中获取数据后,如何避免不必要的组件闪现1秒?

django无法解析余数:[0] from carray[0]'

Msgraph用户邀请自定义邮箱模板

如何在Angular17 APP中全局设置AXIOS

用JS从平面文件构建树形 struct 的JSON

本地库中的chartjs-4.4.2和chartjs-plugin-注解

同一类的所有div';S的模式窗口

为什么JPG图像不能在VITE中导入以进行react ?

Reaction Redux&Quot;在派单错误中检测到状态Mutations

为什么云存储中的文件不能公开使用?

令牌JWT未过期

在验证和提交表单后使用useNavigate()进行react 重定向,使用带有加载器和操作的路由

如何在Jest中模拟函数

react 路由DOM有条件地呈现元素

Angel Auth Guard-用户只有在未登录时才能访问登录页面,只有在登录时才能访问其他页面

调用特定数组索引时,为什么类型脚本不判断未定义

使用静态函数保存 node 前的钩子

错误400:当我试图在React中使用put方法时,该字段是必需的