“!--”在JavaScript中做了什么?

我有这段代码(取自这个问题):

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

我试图遵循它,我想我理解了一切,除了它说的接近结尾。在这种情况下,该命令有什么作用?!--pending

编辑:我感谢所有进一步的评论,但这个问题已经回答了很多次。无论如何,谢谢!


答案 1

!反转一个值,并给出相反的布尔值:

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

--[value]从数字中减去一 (1),然后返回要使用的数字:

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

因此,从挂起中减去一个,然后返回与其真值/假值相反的值(无论它是否为 )。!--pending0

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

是的,请遵循ProTip。这可能是其他编程语言中的常见习语,但对于大多数声明式JavaScript编程来说,这看起来很陌生。


答案 2

这不是一个特殊的运算符,它是2个标准运算符一个接一个:

  1. 前缀递减 (--)
  2. 逻辑不(!)

这会导致递减,然后进行测试以查看它是否为零。pending