382

この JavaScript スニペットを考えると...

var a;
var b = null;
var c = undefined;
var d = 4;
var e = 'five';

var f = a || b || c || d || e;

alert(f); // 4

誰かが私にこのテクニックが何と呼ばれているか説明してもらえますか (私の最良の推測はこの質問のタイトルにあります!)? そして、それが正確にどのように/なぜ機能するのですか?

私の理解では、変数fには、null または未定義ではない値を持つ最初の変数の最も近い値 (左から右へ) が割り当てられるということですが、この手法に関する多くの参考資料を見つけることができず、それがたくさん使われているのを見ました。

また、この手法は JavaScript に固有のものですか? PHPで同様のことを行うと、それ自体fの値ではなく、真のブール値が得られることを私は知っていdます。

4

12 に答える 12

240

説明については、短絡評価を参照してください。これは、これらの演算子を実装する一般的な方法です。これは JavaScript に固有のものではありません。

于 2010-01-20T10:54:26.753 に答える
226

これは、変数がfalsyの場合にデフォルト値(この場合は の値)を割り当てるために作成されます。yx

JavaScript のブール演算子はオペランドを返すことができますが、他の言語のように常にブール値の結果を返すとは限りません。

論理 OR 演算子 ( ||) は、最初のオペランドが偽の場合、2 番目のオペランドの値を返します。それ以外の場合は、最初のオペランドの値が返されます。

例えば:

"foo" || "bar"; // returns "foo"
false || "bar"; // returns "bar"

偽のfalse値は、ブール値のコンテキストで使用されたときに強制されるものであり0nullundefined、 、空の文字列、NaNそしてもちろんfalse.

于 2010-06-21T20:11:51.397 に答える
214

Javascript は、論理演算子andに対して短絡評価を使用します。ただし、または値ではなく、実行を停止した最後の値の結果を返すという点で、他の言語とは異なります。||&&truefalse

次の値は、JavaScript では偽と見なされます。

  • 間違い
  • ヌル
  • ""(空文字列)
  • 0
  • ナン
  • 未定義

演算子の優先順位規則を無視し、物事を単純に保つと、次の例は、どの値が評価を停止し、結果として返されるかを示しています。

false || null || "" || 0 || NaN || "Hello" || undefined // "Hello"

最初の 5 つの値までNaNは偽であるため、最初の真の値に一致するまですべて左から右に評価されます"Hello"。これにより、式全体が真になり、それ以上の値は評価されず"Hello"、式の結果として返されます。 . 同様に、この場合:

1 && [] && {} && true && "World" && null && 2010 // null

null最初の 5 つの値はすべて真であり、式を false にする最初の偽値 ( ) を満たすまで評価されるため、それ2010以上評価されずnull、式の結果として返されます。

あなたが与えた例は、JavaScript のこのプロパティを利用して割り当てを実行しています。一連の値の中で最初の真または偽の値を取得する必要がある場所ならどこでも使用できます。以下のコードは、if-else チェックを行う代わりに、デフォルト値の割り当てを容易にするため、に値を割り当てます"Hello"b

var a = false;
var b = a || "Hello";

以下の例はこの機能の悪用と言えますが、コードが読みにくくなっていると思います。

var messages = 0;
var newMessagesText = "You have " + messages + " messages.";
var noNewMessagesText = "Sorry, you have no new messages.";
alert((messages && newMessagesText) || noNewMessagesText);

アラート内で、 が偽物かどうかを確認し、messages偽物である場合は評価して を返しnoNewMessagesText、そうでない場合は評価して を返しnewMessagesTextます。この例では誤りなので、 noNewMessagesText と alert で停止し"Sorry, you have no new messages."ます。

于 2010-06-21T21:02:19.060 に答える
52

Javascript 変数は型指定されていないため、ブール演算子によって割り当てられた場合でも、f に整数値を割り当てることができます。

f には、 false と等しくない最も近い値が割り当てられます。したがって、0、false、null、undefined はすべて渡されます。

alert(null || undefined || false || '' || 0 || 4 || 'bar'); // alerts '4'
于 2010-01-20T10:58:00.913 に答える
32

それに魔法はありません。のようなブール式a || b || c || dは遅延評価されます。Interpeter は の値を探しますa。これは未定義なので false であるため、先に進みます。次に、bどれが null であるかを確認します。それでも false の結果が返されるため、先に進みcます。同じ話です。最後にd、「ええ、null ではないので、結果が得られました」と表示され、最終変数に割り当てられます。

このトリックは、ブール式の遅延短絡評価を行うすべての動的言語で機能します。静的言語ではコンパイルされません (タイプ エラー)。ブール式の評価に熱心な言語では、論理値 (つまり、この場合は true) を返します。

于 2010-01-20T10:58:21.287 に答える
10

この質問には、すでにいくつかの良い回答が寄せられています。

要約すると、この手法は、言語のコンパイル方法の機能を利用しています。つまり、JavaScript はブール演算子の評価を「短絡」し、最初の非 false 変数値または最後の変数に含まれる値のいずれかに関連付けられた値を返します。false と評価される値については、Anurag の説明を参照してください。

この手法を使用することは、いくつかの理由から適切ではありません。でも。

  1. コードの読みやすさ: これはブール演算子を使用しており、これがどのようにコンパイルされるかの動作が理解されていない場合、期待される結果はブール値になります。

  2. 安定性: これは、複数の言語間で一貫性のない言語のコンパイル方法の機能を使用しているため、将来的に変更の対象になる可能性があります。

  3. 文書化された機能: このニーズを満たし、より多くの言語で一貫した既存の代替手段があります。これは三項演算子になります。

    () ? 値 1: 値 2。

三項演算子を使用すると、もう少し入力が必要になりますが、評価されるブール式と代入される値が明確に区別されます。さらに、チェーン化できるため、上記で実行されているデフォルトの割り当てのタイプを再作成できます。

var a;
var b = null;
var c = undefined;
var d = 4;
var e = 'five';

var f =  ( a ) ? a : 
                ( b ) ? b :
                       ( c ) ? c :
                              ( d ) ? d :
                                      e;

alert(f); // 4
于 2016-06-03T14:19:53.217 に答える
4

新しい変数(z)をx「真実」(ゼロ以外、有効なオブジェクト/配列/関数/それが何であれ)またはyそれ以外の場合の値に設定しています。xこれは、存在しない場合にデフォルト値を提供する比較的一般的な方法です。

たとえば、オプションのコールバック パラメータを受け取る関数がある場合、何もしないデフォルトのコールバックを指定できます。

function doSomething(data, callback) {
    callback = callback || function() {};
    // do stuff with data
    callback(); // callback will always exist
}
于 2010-06-21T20:13:32.873 に答える
2

が設定されている場合x、 の値はzになりx、それ以外の場合yが設定されている場合、その値はzの値として設定されることを意味します。

それは同じです

if(x)
  z = x;
else
  z = y;

これは、JavaScript の論理演算子がブール値ではなく、操作を完了するために必要な最後の要素の値を返すためです (OR 文では最初の非 false 値になり、AND 文では最後の値になります)。 )。操作が失敗した場合は、 thenfalseが返されます。

于 2010-06-21T20:11:40.847 に答える
1

X を評価し、X が null、空の文字列、または 0 (論理 false) でない場合は、それを z に割り当てます。X が null、空の文字列、または 0 (論理 false) の場合、y が z に割り当てられます。

var x = '';
var y = 'bob';
var z = x || y;
alert(z);

「ボブ」を出力します。

于 2010-06-21T20:13:16.807 に答える