【问题标题】:React props comparison: "_.isEqual" versus "==="React 道具比较:“_.isEqual”与“===”
【发布时间】:2018-10-12 01:51:39
【问题描述】:

我的问题是 lodash 对相等性的深度比较和 === 的严格相等性在比较 componentWillReceiveProps 生命周期方法中的 nextProps 和 self.props 的字段时返回不同的值。

  1. 这是否意味着这些属性的值必须是不同的类型?我假设 _.isEqual 确实会进行类型转换以比较相等性,因为 === 不会。
  2. nextProps 和 self.props 的字段进行相等性检查时,是否推荐使用 _.isEqual?

这是我的具体例子 -

componentWillReceiveProps(nextProps){
  (nextProps.obj === self.props.obj);        // false
   _.isEqual(nextProps.obj, self.props.obj); // true

   typeof(nextProps.obj);  // object
   typeof(self.props.obj); // object

   nextProps.obj;   // { k1: "v1", k2: "v2", k3: "v3" }
   self.props.obj;  // { k1: "v1", k2: "v2", k3: "v3" }
}

有人知道会发生什么吗?

【问题讨论】:

    标签: reactjs properties react-redux lodash equality


    【解决方案1】:

    在 javascript 中,当您使用 '===' 比较对象时,它只会在对象相同时返回 true,而 _.isEqual 将在对象相等时返回 true。

    参考您的实际问题,我认为您应该使用 _.isEqual 来比较 2 个对象,看看它们是否是彼此的精确副本。

    详情见: https://lodash.com/docs#isEqual

    【讨论】:

      【解决方案2】:

      _.isEquals

      在两个值之间执行深度比较以确定它们是否相等。如果值相等,它将返回 true,否则返回 false。

      Lodash _.isEquals

      例子:

      var object = { 'a': 1 };
      var other = { 'a': 1 };
       
      console.log(_.isEqual(object, other));
      <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.min.js"></script>

      ===

      为了严格相等,被比较的对象必须具有相同的类型并且:

      compared 必须具有相同的类型并且:

      • 当两个字符串具有相同的序列时,它们是严格相等的 字符,相同的长度和相同的 对应位置的字符。
      • 两个数在数值相等时是严格相等的(有 相同的数值)。 NaN 不是 等于任何东西,包括 NaN。 正零和负零相等 彼此。
      • 如果两个布尔操作数都为真或 两者都是错误的。
      • 如果两个对象引用同一个对象,则它们是严格相等的

      Comparison Operators - MDC

      例子:

      var object = { 'a': 1 };
      var other = { 'a': 1 };
       
       
      console.log(object === other);
      // => false

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-11
        • 2021-08-11
        • 2023-03-04
        • 2011-09-15
        • 2023-01-27
        • 1970-01-01
        相关资源
        最近更新 更多