var cow = {a: 1, b: {}, c: []};
_.isEmpty(cow); // returns false
isEmpty funktioniert gut bei Objekten, die Zahlen als einzige 'nicht leere' Werte enthalten
_.isEmpty(cow.a); // returns true
Das Individuum k, v von a: 1 wird jedoch als leer betrachtet.
Ich habe die Probleme durchgelesen und festgestellt, dass _.isEmpty ursprünglich nicht für Zeichenfolgen gedacht war, daher könnte dies beabsichtigt sein. Wenn es nicht beabsichtigt ist, habe ich einen Zweig, für den ich eine Pull-Anfrage stellen kann.
Der Anwendungsfall, auf den ich gestoßen bin, war so etwas
_.each(cow, function(v, k) {
if (_.isEmpty(v)) {
// do something with k because of v being empty
}
});
Cow.a würde also genauso behandelt wie cow.b und cow.c. Ich kann es umschreiben, dachte aber, es wäre so viel ordentlicher, wenn ich es nicht müsste (und wenn es nicht den Geist oder die Vision des Unterstrichs brechen würde)
Ja, _.isEmpty
ist nur für Objekte und Arrays definiert. Sie sollten es nicht für Zeichenfolgen oder Zahlen verwenden.
Sie sollten es nicht für Zahlen verwenden. Saiten sind okay:
https://github.com/documentcloud/underscore/commit/79f65b440ad5e14ff2c624a836a3eff33465be9f
https://github.com/documentcloud/underscore/blob/322a64135dc3c4a649f102e962054310c2b39c04/underscore.js#L808
Welche Alternativen müssen wir für Zahlen verwenden?
@jashkenas oder @michaelficarra : _.isNumber
in _.isEmpty
nicht aufgerufen wird? (auf die gleiche Weise werden _.isArray
und _.isString
verwendet)
Gibt es einen Grund, warum es sollte?
Nun ja. Ich bin froh, dass du gefragt hast :-)
Wie ich gesehen habe, verwenden die meisten Leute _.isEmpty
um zu überprüfen, ob einer bestimmten Variablen ein Wert (ein beliebiger Wert) zugewiesen wurde. Ich habe viele Entwickler gesehen, die aus diesem Grund auf Probleme gestoßen sind.
Sogar in der offiziellen Dokumentation heißt es "Gibt true zurück, wenn das Objekt keine Werte enthält" - und eine Zahl sollte als Wert gelten.
Wenn ich eine größere Auswirkung auf diese Änderung habe, die ich einfach nicht sehen kann, wäre mein zweitbester Vorschlag, die Dokumentation zu aktualisieren, um klar zu sagen, dass sie nicht für Zahlen verwendet werden sollte :-)
Warum sollten Sie jemals eine Zahl an isEmpty
, anstatt nur zu überprüfen, ob die Zahl null ist?
Sogar in der offiziellen Dokumentation heißt es "Gibt true zurück, wenn das Objekt keine Werte enthält".
Ganz richtig. In JavaScript ist eine Zahl (sehr traurig) kein Objekt.
Ich denke, dies könnte mit _.isEmpty
doc Tweaks geklärt werden. Was Entwickler suchen, ist _.exists .
Es ist sinnvoll, wenn _.isEmpty(a)
bedeutet "Ist a
ein leeres Objekt?", Ähnlich wie wenn die Aussage: if obj == {}
an Werten und nicht an Referenzen gearbeitet hat. Daher würden Werte wie Zahlen false zurückgeben und null und undefiniert.
Eine Beispielimplementierung von _.isEmpty
könnte sein:
_.isEmpty = function(a) {
return _.isEqual(a, {}) || _.isEqual(a, []) || _.isEqual(a, '');
}
@jashkenas Das liegt wahrscheinlich daran, dass in einigen anderen Sprachen "leer" bestimmt, ob die Variable leer ist oder nicht :) http://www.php.net/manual/en/function.empty.php
+1 bis @josser - hauptsächlich, weil ich einen PHP-Hintergrund habe :-p
Aber ich denke, es könnte auch ausreichen, dies nur in der Dokumentation zu klären. Ich sehe ernsthaft Leute, die jede zweite Woche darauf stoßen.
Ich bin heute darauf gestoßen. Ich habe es mit _.omit verwendet
_.omit(someObject, _.isEmpty);
Hilfreichster Kommentar
Nun ja. Ich bin froh, dass du gefragt hast :-)
Wie ich gesehen habe, verwenden die meisten Leute
_.isEmpty
um zu überprüfen, ob einer bestimmten Variablen ein Wert (ein beliebiger Wert) zugewiesen wurde. Ich habe viele Entwickler gesehen, die aus diesem Grund auf Probleme gestoßen sind.Sogar in der offiziellen Dokumentation heißt es "Gibt true zurück, wenn das Objekt keine Werte enthält" - und eine Zahl sollte als Wert gelten.
Wenn ich eine größere Auswirkung auf diese Änderung habe, die ich einfach nicht sehen kann, wäre mein zweitbester Vorschlag, die Dokumentation zu aktualisieren, um klar zu sagen, dass sie nicht für Zahlen verwendet werden sollte :-)