javascriptdecrementprefix-operatornot-operator

What does "!--" do in JavaScript?


I have this piece of code (taken from this question):

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);
                }
            });
        });
    });
};

I'm trying to follow it, and I think I understand everything except for near the end where it says !--pending. In this context, what does that command do?

Edit: I appreciate all the further comments, but the question has been answered many times. Thanks anyway!


Solution

  • ! inverts a value, and gives you the opposite boolean:

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

    --[value] subtracts one (1) from a number, and then returns that number to be worked with:

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

    So, !--pending subtracts one from pending, and then returns the opposite of its truthy/falsy value (whether or not it's 0).

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

    And yes, follow the ProTip. This may be a common idiom in other programming languages, but for most declarative JavaScript programming this looks quite alien.