Was ist der Vorteil von angular.isdefined
darüber hinaus foo === undefined
?
Ich kann mir nicht sofort einen Nutzen vorstellen.
Was ist der Vorteil von angular.isdefined
darüber hinaus foo === undefined
?
Ich kann mir nicht sofort einen Nutzen vorstellen.
typeof foo === "undefined"
trotzdem verwenden, wenn Sie undefinierte Variablen verarbeiten.
foo === undefined
nicht aus? Windows, Frames?
undefined
kann neu definiert werden
Antworten:
Der Zugriff auf eine wirklich undefinierte Variable in Javascript, außer typeof, löst einen Fehler aus. Sie können nur Angular.isDefined
mit 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
angular.isDefined(window.obj);
Großbuchstaben verwenden, verursacht Referenzfehler
truthy
oder falsey
Ergebnis 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
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
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']
myvar = myvar || 'some init value';
wird auch der Zeichenfolgenwert zugewiesen, wenn myvar
definiert ist, dass nicht null, sondern falsey ist. Wenn dies beispielsweise der Fall myvar
ist false
, funktioniert Ihr Zuweisungstrick hier nicht vorhersehbar.
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.isDefined
und warum sie dachten, es sei besser als die einfache JavaScript-Alternative.
foo
kann es sich um einen Namen handeln, der im aktuellen Bereich nicht definiert ist, während im zweiten Fall ein ReferenceError ausgelöst wird.