Was macht “!–” in JavaScript?

Lesezeit: 4 Minuten

Benutzer-Avatar
Kieran E

Ich habe diesen Code (aus dieser Frage entnommen):

var walk = function(dir, done) {
    var results = [];

    fs.readdir(dir, function(err, list) {
        if (err)
            return done(err);

        var pending = list.length;

        if (!pending) 
            return done(null, results);

        list.forEach(function(file) {
            file = path.resolve(dir, file);
            fs.stat(file, function(err, stat) {
                if (stat && stat.isDirectory()) {
                    walk(file, function(err, res) {
                        results = results.concat(res);

                        if (!--pending)
                            done(null, results);
                    });
                } else {
                    results.push(file);

                    if (!--pending) 
                        done(null, results);
                }
            });
        });
    });
};

Ich versuche, ihm zu folgen, und ich glaube, ich verstehe alles, außer gegen Ende, wo es heißt !--pending. Was macht dieser Befehl in diesem Zusammenhang?

Bearbeiten: Ich schätze alle weiteren Kommentare, aber die Frage wurde schon oft beantwortet. Danke trotzdem!

  • Könnten Sie diesen Code erklären, ich verstehe nicht, warum überprüfen if (!--pending) done(null, results);?

    – Schwarze Mamba

    17. Dezember 2015 um 1:26 Uhr

  • Das erinnert mich an den Namen des --> Operator?

    – Soner Gönül

    17. Dezember 2015 um 11:01 Uhr

  • Beachten Sie, dass der Anwendungsfall hier trivial mit Versprechungen gelöst werden kann, anstatt unseren eigenen Synchronisationsmechanismus zu erfinden. Diese Funktion führt auch keine korrekte Fehlerbehandlung durch. Aus diesem Grund sollten Sie Ihre eigene Parallelität nicht rollen, es sei denn, Sie haben einen guten Grund.

    – Benjamin Grünbaum

    19. Dezember 2015 um 13:35 Uhr

Benutzer-Avatar
TbWill4321

! invertiert einen Wert und gibt Ihnen den entgegengesetzten booleschen Wert:

!true == false
!false == true
!1 == false
!0 == true

--[value] subtrahiert eins (1) von einer Zahl und gibt dann diese Zahl zurück, mit der gearbeitet werden soll:

var a = 1, b = 2;
--a == 0
--b == 1

So, !--pending subtrahiert eins von ausstehend und gibt dann das Gegenteil seines Wahrheits-/Falschwerts zurück (unabhängig davon, ob es sich um einen Wert handelt oder nicht 0).

pending = 2; !--pending == false 
pending = 1; !--pending == true
pending = 0; !--pending == false

Und ja, folgen Sie dem ProTipp. Dies mag in anderen Programmiersprachen eine gebräuchliche Redewendung sein, aber für die meisten deklarativen JavaScript-Programmierungen sieht dies ziemlich fremd aus.

Benutzer-Avatar
Amit

Das ist kein spezieller Operator, das sind 2 Standardoperatoren hintereinander:

  1. Ein Präfix-Dekrement (--)
  2. Ein logisches nicht (!)

Dies bewirkt pending zu dekrementieren und dann zu testen, ob es null ist.

Eine Reihe von Antworten beschreibt was dieser Befehl funktioniert, aber nicht warum das wird hier so gemacht.

Ich komme aus der C-Welt und lese !--pending als „Count down pending und prüfen Sie, ob es Null ist”, ohne wirklich darüber nachzudenken. Es ist eine Redewendung, die meiner Meinung nach Programmierer in ähnlichen Sprachen kennen sollten.

Die Funktion verwendet readdir um eine Liste von Dateien und Unterverzeichnissen zu erhalten, die ich gemeinsam “Einträge” nennen werde.

Die Variable pending verfolgt, wie viele davon noch zu verarbeiten sind. Sie beginnt mit der Länge der Liste und zählt bei der Verarbeitung jedes Eintrags abwärts gegen Null.

Diese Eingaben werden möglicherweise nicht in der richtigen Reihenfolge verarbeitet, weshalb es notwendig ist, herunterzuzählen, anstatt nur eine einfache Schleife zu verwenden. Wann alle die Eingaben wurden verarbeitet der Rückruf done wird gerufen, um den ursprünglichen Anrufer über diese Tatsache zu informieren.

Beim ersten Aufruf an done vorangestellt ist return, nicht weil wir einen Wert zurückgeben wollen, sondern einfach, damit die Funktion an diesem Punkt nicht mehr ausgeführt wird. Es wäre sauberer gewesen, den Code zu löschen return und setze die Alternative in ein else.

Benutzer-Avatar
Lukas

Es ist eine Abkürzung.

! ist nicht”.

-- verringert einen Wert.

So !-- prüft, ob der Wert, der durch Negieren des Ergebnisses des Dekrementierens eines Werts erhalten wird, falsch ist.

Versuche dies:

var x = 2;
console.log(!--x);
console.log(!--x);

Die erste ist falsch, da der Wert von x 1 ist, die zweite ist wahr, da der Wert von x 0 ist.

Randnotiz:
!x-- würde zuerst prüfen, ob x falsch ist, und es dann dekrementieren.

Benutzer-Avatar
Sterling Archer

! ist das JavaScript NICHT Operator

-- ist ein Prä-Dekrement-Operator. So,

x = 1;
if (!x) // false
if (!--x) // becomes 0 and then uses the NOT operator,
          // which makes the condition to be true

if(!--pending)

meint

if(0 == --pending)

meint

pending = pending - 1;
if(0 == pending)

Benutzer-Avatar
Peter Mortensen

Es ist der Not-Operator, gefolgt von dem In-Place-Pre-Decrementer.

Also wenn pending war eine Ganzzahl mit dem Wert 1:

val = 1;
--val; // val is 0 here
!val // evaluates to true

1317140cookie-checkWas macht “!–” in JavaScript?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy