Ich überprüfe die Anzahl der Ziffern in einer Zeichenfolge mit den Eigenschaften match
und length
. Hier ist der Codepen mit meiner Funktion Ссылка
Beim Zurückgeben von numberOfDigits.length
wurde zuerst eine Fehlermeldung angezeigt ( Cannot read property 'length' of null
). Ich habe dieses Problem gelöst, indem ich die Zeile in (numberOfDigits && numberOfDigits.length)
geändert habe.
Das funktioniert, aber ich möchte besser verstehen, warum die neue Anweisung jetzt ausgeführt werden kann. Führt der Interpreter jetzt die 'numberOfDigits.length' aus?
Warum erhalten wir die gleichen Fehler, wenn die Operanden umgekehrt werden (numberOfDigits.length && numberOfDigits)
?
Hier ist der vollständige JavaScript-Code:
%Vor%UPDATE 1: Die Antworten unten erklärten:
&&
Ausdruck zählt. &&
. Wenn der erste Operand null ergibt, dann überprüft JavaScript den zweiten Operator nicht, da der Ausdruck nicht zu nichts anderem als null
/ false
. JavaScript versucht den Operator &&
zu optimieren:
Wenn numberOfDigits
ein falscher Wert ist (und null
ist falsy ), dann ist der gesamte Ausdruck falsy und es ist nicht notwendig,% co_de auszuwerten %.
Falsy Werte sind: numberOfDigits.length
, undefined
, null
, 0
, ''
, false
. Eine Möglichkeit, um zu überprüfen, ob etwas falsch ist, ist die Verwendung von NaN
(oder mehr praktisch, aber weniger ausführlich Boolean(falsyValue) === false
).
Dies ist ein Nebeneffekt des ! falsyValue
-Operators. Ich kann empfehlen, es zu vermeiden und den Code in etwas Lesbares umzuwandeln:
"Führt der Interpreter die 'numberOfDigits.length jetzt aus?"
Nein, JavaScript schließt logische Ausdrücke kurz - sobald das Ergebnis bekannt ist (dh der erste Operand in and
ist falsch oder der erste Operand in or
ist truthy), werden im Ausdruck keine weiteren Operationen ausgeführt.
Text & Tabellen: Ссылка
auch, Vorsicht: &&
und ||
geben nicht unbedingt Booleans in JavaScript
Der Grund dafür ist, dass, wenn der Interpreter zwei Operationen mit einem logischen verbunden sieht und (& amp; & amp; & amp; ampl;) zuerst ausführt, und nur dann, wenn er für wahr evaluiert wird dann wird er ausgeführt Letzteres.
deshalb, weil numberOfDigits
null ist, was in JS gleich false ist, stoppt es die Ausführung und stürzt nie auf numberOfDigits.length
ab.
andersherum wird natürlich abstürzen.
Bei einem logischen ODER (||) hört der Interpreter auf zu evaluieren, nachdem die erste Anweisung wahr ist.
Ich glaube, der Grund ist, dass die Reihenfolge der Bedingungen zählt.
Die Bedingung numberOfDigits wird zuerst ausgewertet. Wenn das also falsch ist, werden die restlichen Bedingungen nicht ausgewertet und Sie erhalten keinen Fehler.
In der anderen Reihenfolge würden Sie versuchen, die Eigenschaft "length" von null zu lesen und einen Fehler zu erzeugen.
"Und" Logik wird wie folgt ausgeführt.
%Vor% Wenn die erste Bedingung fehlschlägt, dann hat es keinen Sinn, die zweite auszuführen.
Deshalb wird numberOfDigits.length
nicht ausgeführt, wenn numberOfDigits
null oder undefiniert ist, also kein Fehler im folgenden Fall.
In der gleichen Weise, wenn die erste Bedingung nicht null ist, wird die zweite Bedingung ausgeführt.
%Vor%Hinweis: In JavaScript werden
null
undundefined
alsfalse
interpretiert in bedingten Anweisungen.
Tags und Links javascript null logic logical-operators string-length