当前位置: 首页 > news >正文

WHAT - React useEffect 依赖的 Object.is

目录

  • 一、背景
  • 二、Object.is 的语法
  • 三、Object.is 的行为
  • 四、总结

一、背景

在 https://react.dev/reference/react/useEffect 中我们了解到:

React will compare each dependency with its previous value using the Object.is comparison.

接下来我们学习一下 Object.is 。Object.is 是 JavaScript 中的一个静态方法,用于比较两个值是否相同。它与 === 运算符的行为略有不同,尤其在处理特殊值(比如 NaN-0)时表现更为准确和可预测。

二、Object.is 的语法

Object.is(value1, value2)
  • value1:第一个要比较的值。
  • value2:第二个要比较的值。

三、Object.is 的行为

  1. 基本用法

    Object.is(1, 1);     // true
    Object.is(1, '1');   // false
    Object.is('foo', 'foo'); // true
    
    • Object.is 类似于严格相等运算符 ===,但是处理一些特殊情况时有所不同。
  2. 处理特殊值

    Object.is(NaN, NaN);   // true
    Object.is(0, -0);      // false
    Object.is(-0, -0);     // true
    
    • NaN 是 JavaScript 中特殊的非数值(Not-a-Number)。
    • -00 被视为不同的值,尽管它们在一般的数值比较中是相等的。
  3. 与严格相等运算符 === 的区别

    NaN === NaN;   // false
    0 === -0;      // true
    -0 === -0;     // true
    
    • === 运算符在比较 NaN-0 时的结果与 Object.is 不同。
  4. 在 React 中的应用

    React 使用 Object.is 来进行依赖项比较。在函数组件的 useEffectuseMemo 钩子中,React 会比较依赖项的前一个值和当前值,以决定是否重新计算或执行相关的效果。

    useEffect(() => {// Effect code
    }, [dependency1, dependency2]);
    
    • 在上述例子中,React 将使用 Object.is 比较 dependency1dependency2 的前一个值和当前值。如果值不同(使用 Object.is 的定义),则重新运行 useEffect 中的代码。

四、总结

Object.is 是 JavaScript 中用于比较两个值是否严格相等的方法,它在处理特殊值(如 NaN-0)时与 === 运算符有所不同。在 React 中,React Hooks 如 useEffectuseMemo 使用 Object.is 来确定依赖项是否发生变化,从而决定是否重新执行相关的效果或计算。

http://www.lryc.cn/news/391894.html

相关文章:

  • 【Java EE】Spring IOCDI
  • 【FreeRTOS】同步互斥与通信 有缺陷的同步示例
  • Lambda表达式讲解
  • 深入了解Linux中的dnsmasq:配置与优化指南
  • 【React】Ant Design -- Table分页功能实现
  • 400G SR4和800G SR8光模块在AI集群中的应用
  • ARM功耗管理软件之DVFSAVS
  • 【堆 优先队列】23. 合并 K 个升序链表
  • 云桌面运维工程师
  • AGI 之 【Hugging Face】 的【Transformer】的 [ Transformer 架构 ] / [ 编码器 ]的简单整理
  • 【在大模型RAG系统中应用知识图谱】
  • 第二十条:与抽象类相比,优先选择接口
  • 20240705
  • 【2023ICPC网络赛I 】E. Magical Pair
  • Kafka-服务端-网络层-源码流程
  • 百日筑基第十一天-看看SpringBoot
  • Generative Modeling by Estimating Gradients of the Data Distribution
  • vector与list的简单介绍
  • 四种线程池的使用,优缺点分析
  • 什么是 BEM 规范
  • 【Node.JS】入门
  • Amazon SageMaker 机器学习之旅的助推器
  • TransMIL:基于Transformer的多实例学习
  • 3.用户程序与驱动交互
  • 尽量不写一行if...elseif...写出高质量可持续迭代的项目代码
  • xcrun: error: unable to find utility “simctl“, not a developer tool or in PATH
  • 【linux高级IO(一)】理解五种IO模型
  • 前端引用vue/element/echarts资源等引用方法Blob下载HTML
  • 昇思MindSpore学习笔记2-01 LLM原理和实践 --基于 MindSpore 实现 BERT 对话情绪识别
  • uniapp实现图片懒加载 封装组件