Underscore: _.isComportement vide sur les nombres

Créé le 13 janv. 2012  ·  13Commentaires  ·  Source: jashkenas/underscore

var cow = {a: 1, b: {}, c: []};
_.isEmpty(cow); // returns false

isEmpty fonctionne très bien sur les objets contenant des nombres comme seules valeurs `` non vides ''

_.isEmpty(cow.a); // returns true

Cependant l'individu k, v de a: 1 est considéré comme vide.

J'ai lu les problèmes et noté qu'à l'origine _.isEmpty n'était pas destiné aux chaînes, donc cela pourrait être voulu. Si ce n'est pas prévu, j'ai une branche pour laquelle je peux faire une pull request.

question

Commentaire le plus utile

Hé bien oui. Je suis content que vous ayez demandé :-)

La façon dont j'ai vu la plupart des gens utiliser _.isEmpty est à peu près pour vérifier si une valeur (n'importe quelle valeur) a été affectée à une variable particulière. J'ai vu de nombreux développeurs se heurter à des problèmes à cause de cela.

Même la documentation officielle indique "Renvoie vrai si l'objet ne contient aucune valeur" - et un nombre doit être considéré comme une valeur.

S'il y a un type d'implication plus large dans ce changement que je ne peux tout simplement pas voir, alors ma deuxième meilleure suggestion serait de mettre à jour la documentation pour indiquer clairement qu'elle ne doit pas être utilisée pour les nombres :-)

Tous les 13 commentaires

Le cas d'utilisation que j'ai rencontré était de faire quelque chose comme ça

_.each(cow, function(v, k) {
  if (_.isEmpty(v)) {
    // do something with k because of v being empty
  }
});

Ainsi, cow.a serait traité comme cow.b et cow.c. Je peux coder autour de lui, mais je pensais que ce serait tellement plus soigné si je n'avais pas à le faire (et si cela ne brisait pas l'esprit ou la vision du soulignement)

Oui, _.isEmpty n'est défini que pour les objets et les tableaux. Vous ne devriez pas l'utiliser sur des chaînes ou des nombres.

Alors, quelles alternatives devons-nous utiliser sur les nombres?

@jashkenas ou @michaelficarra : une raison particulière pour laquelle _.isNumber n'est pas appelé avec in _.isEmpty ? (de la même manière que _.isArray et _.isString sont utilisés)

Une raison pour laquelle cela devrait?

Hé bien oui. Je suis content que vous ayez demandé :-)

La façon dont j'ai vu la plupart des gens utiliser _.isEmpty est à peu près pour vérifier si une valeur (n'importe quelle valeur) a été affectée à une variable particulière. J'ai vu de nombreux développeurs se heurter à des problèmes à cause de cela.

Même la documentation officielle indique "Renvoie vrai si l'objet ne contient aucune valeur" - et un nombre doit être considéré comme une valeur.

S'il y a un type d'implication plus large dans ce changement que je ne peux tout simplement pas voir, alors ma deuxième meilleure suggestion serait de mettre à jour la documentation pour indiquer clairement qu'elle ne doit pas être utilisée pour les nombres :-)

Pourquoi voudriez-vous passer un nombre dans isEmpty , au lieu de simplement vérifier si le nombre est nul?

Même la documentation officielle indique "Renvoie vrai si l'objet ne contient aucune valeur"

Tout à fait raison. En JavaScript, un nombre n'est (très malheureusement) pas un objet.

Je pense que cela pourrait être résolu avec des ajustements de _.isEmpty doc. Ce que les développeurs recherchent, c'est _.exists .

Il est logique que _.isEmpty(a) signifie "est a un objet vide?", Un peu comme si l'instruction: if obj == {} travaillait sur des valeurs et non sur des références. Par conséquent, des valeurs telles que les nombres renverraient false, de même que nulles et non définies.

un exemple d'implémentation de _.isEmpty pourrait être:

_.isEmpty = function(a) {
  return _.isEqual(a, {}) || _.isEqual(a, []) || _.isEqual(a, '');
}

@jashkenas C'est probablement parce que dans certaines autres langues, "vide" détermine si la variable est vide ou non :) http://www.php.net/manual/en/function.empty.php

+1 à @josser - principalement parce que j'ai une formation PHP :-p
Mais je pense que le simple fait de le clarifier dans la documentation pourrait également suffire. Je vois sérieusement que des gens rencontrent cela toutes les deux semaines.

Je suis tombé sur ça aujourd'hui .. Je l'utilisais avec _.omit

_.omit(someObject, _.isEmpty);
Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

haggholm picture haggholm  ·  8Commentaires

arieljake picture arieljake  ·  4Commentaires

chikamichi picture chikamichi  ·  8Commentaires

acl0056 picture acl0056  ·  5Commentaires

Francefire picture Francefire  ·  5Commentaires