Was ist der Vorteil von angular.isdefined
darüber hinaus foo === undefined
?
Ich kann mir nicht sofort einen Nutzen vorstellen.
javascript
angularjs
Ben Aston
quelle
quelle
typeof foo === "undefined"
trotzdem verwenden, wenn Sie undefinierte Variablen verarbeiten.foo === undefined
nicht aus? Windows, Frames?undefined
kann neu definiert werdenAntworten:
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
quelle
angular.isDefined(window.obj);
Großbuchstaben verwenden, verursacht Referenzfehlertruthy
oderfalsey
Ergebnis aus der Bewertung vonthat thing that may or may not be
- so ist sein Nutzenits easy to not break things by leaning on this construct
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.
quelle
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.
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']
quelle
myvar = myvar || 'some init value';
wird auch der Zeichenfolgenwert zugewiesen, wennmyvar
definiert ist, dass nicht null, sondern falsey ist. Wenn dies beispielsweise der Fallmyvar
istfalse
, 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" alstypeof 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 wollteangular.isDefined
und warum sie dachten, es sei besser als die einfache JavaScript-Alternative.quelle
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.