Was ist der Vorteil von angle.isdefined?

72

Was ist der Vorteil von angular.isdefineddarüber hinaus foo === undefined?

Ich kann mir nicht sofort einen Nutzen vorstellen.

Ben Aston
quelle
3
Schreibkomfort, Konsistenz
devqon
2
Sie möchten es typeof foo === "undefined"trotzdem verwenden, wenn Sie undefinierte Variablen verarbeiten.
theonlygusti
1
@theonlygusti Warum reicht das foo === undefinednicht aus? Windows, Frames?
Ben Aston
2
@ Ben Es wird manchmal einen Fehler auslösen, siehe diese Frage und die Antworten hier .
theonlygusti
Vergessen Sie nicht, in Legacy-Code undefinedkann neu definiert werden
danwellman

Antworten:

47

Der Zugriff auf eine wirklich undefinierte Variable in Javascript, außer typeof, löst einen Fehler aus. Sie können nur Angular.isDefinedmit Eigenschaften verwenden. ZB würde das gut funktionieren:

angular.isDefined(window.obj);

Weil obj eine undefinierte Eigenschaft des Fensters ist.

Beispiele für das erwartete Verhalten:

var foo;
var bar = 42;

typeof foo !== 'undefined'; // false
typeof bar !== 'undefined'; // true
typeof baz !== 'undefined'; // false

angular.isDefined(foo); // false
angular.isDefined(bar); // true
angular.isDefined(baz); // ReferenceError
Bharath Kumar Bachina
quelle
1
es sollte angular.isDefined(window.obj);Großbuchstaben verwenden, verursacht Referenzfehler
sricks
1
In Ihrem Beispiel ist foo also "undefiniert", da es deklariert, aber nicht zugewiesen wurde, während baz " wirklich undefiniert" ist, da es nicht einmal deklariert wurde? ... interessant.
Niko Bellic
28
Wie ist das ein Vorteil? :)
Petr Peller
1
Vielleicht ist der vermeintliche Vorteil, dass es wohl weniger eine mentale Belastung ist, zu fragen, ob etwas definiert ist, als zu fragen, ob es nicht undefiniert ist .
Jason Swett
@PetrPeller - es ist nicht unbedingt ein Vorteil, sondern ermöglicht ein truthyoder falseyErgebnis aus der Bewertung von that thing that may or may not be- so ist sein Nutzenits easy to not break things by leaning on this construct
Brandt Solovij
27

Hier ist die Quelle:

function isDefined(value) {return typeof value !== 'undefined';}

Offensichtlich ist der erste Grund eine geringere Ausführlichkeit, aber es sind auch zukünftige Beweise für Winkel, insbesondere wenn die Funktion intern verwendet wird.

Matt Way
quelle
17

Wie Kamrul sagte, macht eckig:

function isDefined(value) { return typeof value !== 'undefined'; }

Was bedeutet, dass "der Typ dieser Variablen undefiniert ist" ... in Ihrem Beispiel vergleichen Sie, dass der Inhalt der Variablen gleich undefiniert ist und Angular den Typ der Variablen überprüft.

In js sind die Typen dynamisch. Bis Sie keinen Wert zuweisen, hat die Variable keinen Typ. IsDefined teilt Ihnen also beide mit, ob eine Variablendeklaration vorhanden ist und ob diese Variable Inhalt hat.

Seien Sie jedoch vorsichtig, da die Variable null sein kann. In diesem Fall wäre der Typ der Variablen ein Objekt.

Sie könnten diesen Code ausprobieren:

var a;
var b = 'asd';
var c = null;

console.log('a: ' + typeof a);
console.log('b: ' + typeof b);
console.log('c: ' + typeof c);
console.log('d: ' + typeof d);

Und Sie werden den nächsten in der Konsole sehen:

a: undefined
b: string 
c: object 
d: undefined

Damit,

a) Die Variable existiert, hat aber keinen Wert und ist daher undefiniert

b) Die Variable existiert und hat einen Wert. Dieser Wert ist eine Zeichenfolge, dies ist also ihr Typ

c) die var existiert, ist aber null, der Typ kann nicht gestört werden, so dass sein Typ Objekt ist

d) die var wurde nicht deklariert, also ... ist sie undefiniert

Der Hauptpunkt ist der Unterschied zwischen "a" und "d" ... versuchen Sie also den nächsten:

console.log('a is undefined? ' + a === undefined);
console.log('d is undefined? ' + d === undefined);

Sie sehen den nächsten in der Konsole:

false
Uncaught ReferenceError: d is not defined

Welches ... ist ein großes Problem, weil:

a) sagt dir, dass das nicht undefiniert ist, wenn das nicht stimmt

d) eine Ausnahme auslösen, damit ... Ihr Code fehlschlägt

Fazit

Die Verwendung wird definiert, wenn Sie überprüfen möchten, ob eine Variable vorhanden ist und mit einem Wert initialisiert wurde. Seien Sie jedoch vorsichtig mit Nullwerten, da Null ein Objekt ist (ebenso wie eine definierte Variable).

Wenn Sie überprüfen möchten, ob eine Variable vorhanden ist und einen gültigen Wert hat (also nicht null ist), können Sie einfach Folgendes tun:

if (myvar) {
  console.log('myvar is defined and is not null');
} else {
    console.log('myvar is undefined or null');
}

Ein weiterer guter Trick besteht darin, einen bestimmten Wert zu initialisieren, wenn die Variable nicht mit || definiert ist

myvar = myvar || 'some init value';

Der obige Code nimmt den Wert von myvar an, wenn er definiert und nicht null ist, und wenn er nicht mit einem bestimmten Wert initiiert wird.

Wenn @TonyBrasunas seinen Kommentar abgibt, wenn myvar als falsch bewertet wird, wird 'ein Init-Wert' zugewiesen. Berücksichtigen Sie dies, bevor Sie diesen Trick anwenden.

Dies ist gut in Funktionen, zum Beispiel:

function split(input, charToSplit) {
  charToSplit = charToSplit || ' ';
  return input.split(charToSplit);
}

Dann können Sie standardmäßig mit Leerzeichen teilen: var input = 'asd asd'; var split = split (Eingabe); // -> splited = ['asd', 'asd']

Oder ... mit einem anderen Zeichen:

var input = 'asd|asd';
var splited = split(input, '|');
// --> splited= ['asd', 'asd']
Carlos Verdes
quelle
3
Tatsächlich myvar = myvar || 'some init value';wird auch der Zeichenfolgenwert zugewiesen, wenn myvardefiniert ist, dass nicht null, sondern falsey ist. Wenn dies beispielsweise der Fall myvarist false, funktioniert Ihr Zuweisungstrick hier nicht vorhersehbar.
Tony Brasunas
0

Ich kann nur raten, aber ich denke, meine Vermutung ist ziemlich gut.

Diese beiden Ausdrücke sind funktional äquivalent:

typeof foo !== 'undefined'

angular.isDefined(foo)

Zu den Vorteilen des letzteren gehören:

1) Es ist wohl weniger eine mentale Belastung zu fragen, ob etwas definiert ist, als zu fragen, ob etwas nicht undefiniert ist .

2) angular.isDefined(foo)ist wohl viel weniger "laut" als typeof foo !== 'undefined'und daher schneller zu erfassen, was passiert.

Hinweis: Dies sind nicht meine Argumente für die Überlegenheit von angular.isDefined. Was ich zu vermitteln versuche, ist meine Vermutung, warum das Angular-Team erstellen wollte angular.isDefinedund warum sie dachten, es sei besser als die einfache JavaScript-Alternative.

Jason Swett
quelle
2
Sie sind leider nicht funktional gleichwertig. Im oberen Fall fookann es sich um einen Namen handeln, der im aktuellen Bereich nicht definiert ist, während im zweiten Fall ein ReferenceError ausgelöst wird.
Gunchars