web-dev-qa-db-ja.com

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を言う終わりの近くを除いてすべてを理解していると思います。この文脈では、そのコマンドは何をするのでしょうか。

編集:私はすべてのこれ以上のコメントに感謝します、しかし質問は何度も答えられました。とにかくありがとう!

376
Kieran E

!は値を反転して、反対のブール値を返します。

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

--[value]は、数値から1を減算してから、その数値を返して処理します。

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

そのため、!--pendingは保留中の値から1を引いて、真偽値の反対を返します(0であるかどうかにかかわらず)。

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

はい、ProTipに従ってください。これは他のプログラミング言語では一般的なイディオムかもしれませんが、ほとんどの宣言型JavaScriptプログラミングでは、これは非常に異質なものです。

535
TbWill4321

それは特別な演算子ではありません、それは2つの標準的な演算子を次々としています:

  1. 接頭辞の減少(--
  2. 論理否定(!

これによりpendingがデクリメントされ、それがゼロかどうかが確認されます。

149
Amit

このコマンドは何をしますか/ /何を説明しますか? なぜ それはここでそのように行われます。

私はCの世界から来ました、そして!--pendingを "pendingをカウントダウンして、それがゼロであるかどうかをチェックする"と読んでいますが、実際には考えていません。それは私が似たような言語のプログラマーが知っているべきだと思うという慣用句です。

この関数はreaddirを使ってファイルとサブディレクトリのリストを取得します。これらをまとめて "entries"と呼びます。

変数pendingは、これらのうちいくつが処理されるべきかを追跡します。リストの長さから始まり、各エントリが処理されるたびにゼロに向かってカウントダウンします。

これらのエントリは順不同で処理される可能性があるため、単純なループを使用するのではなくカウントダウンする必要があります。 all エントリが処理されると、コールバックdoneが呼び出され、この事実を元の呼び出し元に通知します。

最初のdoneの呼び出しでは、returnが先頭に追加されています。これは、値を返したいからではなく、単にその時点で関数の実行を停止させるためです。 returnを落として、その代替をelseに入れるのは、よりきれいなコードでした。

108
Stig Hemmer

速記です。

!は "not"です。

--は値をデクリメントします。

そのため、!--は、値の減少の結果を否定して得られた値がfalseかどうかをチェックします。

これを試して:

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

Xの値が1なので最初のものは偽で、xの値は0なので2番目のものは真です。

サイドノート:!x--は最初にxがfalseかどうかをチェックしてからデクリメントします。

35
Lucas

!はJavaScriptの _ではなく_ の演算子です。

--は前減算演算子です。そう、

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

手段

if(0 == --pending)

手段

pending = pending - 1;
if(0 == pending)
23
james turner

これはnot演算子で、その後にインプレースのプリデクリメンタが続きます。

pendingが1の値を持つ整数の場合

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

説明

これは!--の2つの演算子です。

!--x 

したがって、これはxを1ずつ損ない、それがブール値かどうかを確認します。

もっと読みやすくしたい場合は、次のことができます。

var x = 1
x = x - 1   
if(!x){ //=> true
    console.log("I understand `!--` now!") 
}
x //=> 0

やってみよう:

/* This is an example of the above, you can read this, but it is not needed for !-- */function interactive(a){$("span.code").keydown(function(e){if(13==(e.keyCode||e.which)){var t=$(this);t.clone().html("code").insertAfter(t.next().next()).show().focus().after(template.clone().removeClass("result-template").show()).next().after("<br>"),interactive(),e.preventDefault()}}).keyup(function(e){13!=(e.keyCode||e.which)&&run()})}var template=$(".result-template").hide(),code=$("span.code");code.attr("contenteditable","true").each(function(e,t){template.clone().removeClass("result-template").insertAfter(t)}),interactive(),$.fn.reduce=[].reduce;function run(){var b=!1,context={};$("span.code").each(function(){var a=$(this),res=a.next().show().removeClass("error");try{with(context)res.html(b?"":"  //=> "+eval(a.text()))}catch(e){b=e,res.html("  Error: "+b.message).addClass("error")}})};run();
/* This is an example of the above, you can read this, but it is not needed for !-- */span.result.error{display:block;color:red}.code{min-width:10px}body{font-family:Helvetica,sans-serif}
<!-- This is an example of the above, you can read this, but it is not needed for `!--` --><span class="result result-template"> //=> unknown </span> <h2>Edit This Code:</h2><code><span class="code">x = 1</span><br><span class="code">!--x</span><br><span class="code"> x </span><br></code> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Fiddle(コードを試す)

12
Ben Aubin

単にpendingを1つ減らし、その論理的補数(否定)を得ます。 0以外の数の論理的な補数はfalseです。0の場合はtrueです。

11
MinusFour