Warum bekomme ich keinen Fehler beim Überprüfen der Länge von Null [duplizieren]

8

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:

  • Die Reihenfolge der Operanden im && Ausdruck zählt.
  • JavaScript optimiert den Operator && . Wenn der erste Operand null ergibt, dann überprüft JavaScript den zweiten Operator nicht, da der Ausdruck nicht zu nichts anderem als null / false .
  • ausgewertet werden kann
Piotr Berebecki 13.04.2016, 14:34
quelle

5 Antworten

6

JavaScript versucht den Operator && zu optimieren:

%Vor%

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:

%Vor%     
Dmitri Pavlutin 13.04.2016, 14:39
quelle
3

"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

zurück     
Tomasz Lewowski 13.04.2016 14:38
quelle
2

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.

    
Or Yaniv 13.04.2016 14:40
quelle
1

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.

    
Th0rndike 13.04.2016 14:40
quelle
1

"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.

%Vor%

In der gleichen Weise, wenn die erste Bedingung nicht null ist, wird die zweite Bedingung ausgeführt.

%Vor%
  

Hinweis: In JavaScript werden null und undefined als false interpretiert   in bedingten Anweisungen.

    
kakurala 13.04.2016 14:45
quelle