web-dev-qa-db-fra.com

React comparaison d'accessoires: "_.isEqual" contre "==="

Mon problème est que la comparaison approfondie de lodash entre l'égalité et l'égalité stricte de === renvoie des valeurs différentes lors de la comparaison des champs de nextProps et self.props dans la méthode de cycle de vie de componentWillReceiveProps.

  1. Est-ce à dire que les valeurs de ces propriétés doivent être de types différents? Je suppose que _.isEqual effectue une conversion de type pour comparer l'égalité puisque === ne le fait pas.
  2. Est-il recommandé d'utiliser _.isEqual lors de la vérification de l'égalité entre les champs de nextProps et self.props?

Voici mon exemple spécifique -

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" }
}

Est-ce que quelqu'un sait ce qui pourrait se passer?

6
David Streid

_. isEquals :

Effectue une comparaison approfondie entre deux valeurs pour déterminer si elles sont équivalentes. il retournera vrai si les valeurs sont équivalentes, sinon faux.

Lodash _.isEquals

Exemple:

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>

=== :

Pour une égalité stricte, les objets comparés doivent avoir le même type et:

comparé doit avoir le même type et:

  • Deux chaînes sont strictement égales lorsqu'elles ont la même séquence de caractères, la même longueur et les mêmes caractères aux positions correspondantes.
  • Deux nombres sont strictement égaux lorsqu'ils sont numériquement égaux (ont la même valeur numérique). NaN n'est égal à rien, y compris NaN. Les zéros positifs et négatifs sont égaux entre eux.
  • Deux opérandes booléens sont strictement égaux si les deux sont vrais ou les deux sont faux.
  • Deux objets sont strictement égaux s'ils se réfèrent au même objet

Opérateurs de comparaison - MDC

Exemple:

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

En javascript, lorsque vous utilisez '===' pour comparer des objets, il ne retournera vrai que si c'est le même objet tandis que _.isEqual retournera vrai si l'objet est équivalent.

En référence à votre question réelle, je pense que vous devriez utiliser _.isEqual pour comparer 2 objets pour voir s'ils sont la copie exacte l'un de l'autre.

Pour plus de détails, voir: https://lodash.com/docs#isEqual

0
limbuster