web-dev-qa-db-ja.com

感嘆符を使用したJavaScriptの場合とそうでない場合の違いは?

以下のコードは、2で割り切れる数値に対して「is equal」を出力しようとします。

If(!test)then()ではなくif(test)then()でない場合、テストされた条件が「n%2」の場合。以下のコードは、「IF番号が2で割り切れない場合」、「 'number is even'を出力する」と読みますが、これは論理的ではないようです。

より一般的に言えば、条件の指定にIfステートメントを使用するよりも、Unified関数を書くことの利点は何ですか?

どんな助けでも大歓迎です。

function unless(test, then) {
  if (!test) then();
}
function repeat(times, body) {
  for (var i = 0; i < times; i++) body(i);
}

repeat(5, function(n) {
  unless(n % 2, function() {
    console.log(n, "is even");
});
// → 0 is even
// → 2 is even
// → 4 is even
11
Henry

これの議論の余地のない利点は、コードが英語に少し似ていることです。「nの2を法とする剰余がゼロでない限り、nが偶数であることをコンソールに記録します。」

私の経験では、これの実際的な結果として、ほとんどのプログラマーは、快適に感じる前に実際にunless()が何をするかを再確認する必要があります。これは標準のJavascriptではないため、Javascriptが使用されているかどうかを知る方法がありません。または== trueまたは=== 0または実装を調べない限り、他の少しずつ異なるテスト。

この原則の私のお気に入りの例はCOBOLです。その言語は英語に似せるために非常に一生懸命努力したので、非プログラマーでもそれを使用することができました...しかし実際には、プログラマーと非プログラマーの両方がそれを扱うことを嫌うようです。

6
Ixrec

このシナリオのように条件がインラインで提供される場合、利点はありません。変換を簡単に適用して、すべてのケースで適切にそれを無効にすることができます(例:!前面)、およびunlessを画像から削除すると、読者が知っておくべきことが1つ少なくなります。

あるcould条件がコールバックの形式で提供されている場合に利点があります。例:

function test() { return true; }
function unless(test, then) { if (!test()) then(); }

unless(test, function() { console.log("test failed"); });

この状況では、testの否定を、onlyIfを補完する架空の関数unlessに直接渡すことができないため、onlyIfunlessを使用すると、コードを読みやすくすることができます。

onlyIf(test, function() { console.log("test passed"); });

これの代わりに:

onlyIf(function() { return !test(); }, function() { console.log("test passed"); });

上記の状況は、testに伝達する必要がある引数がコールバックに与えられている場合、さらに悪化する可能性があります。

1
Jon