JavaScriptをデバッグしていますが、この||
が何をするのか説明できませんか?
function (title, msg) {
var title = title || 'Error';
var msg = msg || 'Error on Request';
}
この男がvar title = title || 'ERROR'
を使用している理由を教えてください。 var
宣言なしでも表示されることがあります。
これは、title
引数がオプションであることを意味します。したがって、引数なしでメソッドを呼び出すと、"Error"
のデフォルト値が使用されます。
書くの略です:
if (!title) {
title = "Error";
}
ブール式を使用したこの種の略記法は、Perlでも一般的です。次の式で:
a OR b
true
またはa
がb
の場合、true
と評価されます。したがって、a
がtrueの場合、b
をチェックする必要はありません。これは、短絡ブール評価と呼ばれます。
var title = title || "Error";
基本的に、title
がfalse
と評価されるかどうかを確認します。存在する場合、"Error"
を「返します」、そうでない場合、title
を返します。
||
)とは何ですか?ダブルパイプ演算子(||
)はlogical OR
operatorです。 ほとんどの言語では、次のように機能します:
false
の場合、2番目の値をチェックします。 true
の場合、true
を返し、false
の場合、false
を返します。true
の場合、2番目の値が何であっても、常にtrue
を返します。したがって、基本的には次の関数のように機能します。
function or(x, y) {
if (x) {
return true;
} else if (y) {
return true;
} else {
return false;
}
}
それでも理解できない場合は、次の表をご覧ください。
| true false
------+---------------
true | true true
false | true false
つまり、両方の値がfalseの場合にのみfalseになります。
JavaScriptはloosely typed languageであるため、少し異なります。この場合、ブール値以外の値で||
演算子を使用できることを意味します。意味はありませんが、たとえば、関数とオブジェクトでこの演算子を使用できます。
(function(){}) || {}
値がブール値でない場合、JavaScriptはブール値への暗黙の会話を作成します。値がfalsey(例:0
、""
、null
、undefined
( JavaScriptのすべてのfalsey値 を参照)の場合、false
として扱われます。それ以外の場合は、true
として扱われます。
したがって、空の関数は真実なので、上記の例ではtrue
を指定する必要があります。そうではありません。空の関数を返します。これは、JavaScriptの||
演算子が最初に書いたように機能しないためです。次のように機能します。
びっくりした?実際、従来の||
演算子と「互換」です。次の関数として記述できます。
function or(x, y) {
if (x) {
return x;
} else {
return y;
}
}
真実の値をx
として渡すと、x
、つまり真実の値を返します。したがって、後でif
節で使用する場合:
(function(x, y) {
var eitherXorY = x || y;
if (eitherXorY) {
console.log("Either x or y is truthy.");
} else {
console.log("Neither x nor y is truthy");
}
}(true/*, undefined*/));
"Either x or y is truthy."
を取得します。
x
がfalseyの場合、eitherXorY
はy
になります。この場合、y
が真実であれば"Either x or y is truthy."
を取得します。そうでなければ、"Neither x nor y is truthy"
を取得します。
さて、||
演算子がどのように機能するかを知っていれば、おそらくx = x || y
の意味を自分で確認できます。 x
が真である場合、x
がx
に割り当てられるため、実際には何も起こりません。そうでない場合は、y
がx
に割り当てられます。通常、関数のデフォルトパラメータを定義するために使用されます。ただし、偽の値(必ずしもundefined
またはnull
とは限りません)をパラメーターとして渡すことができないため、悪いプログラミング手法と見なされることがよくあります。次の例を検討してください。
function badFunction(/* boolean */flagA) {
flagA = flagA || true;
console.log("flagA is set to " + (flagA ? "true" : "false"));
}
一見有効です。ただし、false
パラメーターとしてflagA
を渡した場合はどうなります(ブール値であるため、つまりtrue
またはfalse
になる可能性があるため)? true
になります。この例では、flagA
をfalse
に設定する方法はありません。
次のように、flagA
がundefined
であるかどうかを明示的にチェックすることをお勧めします。
function goodFunction(/* boolean */flagA) {
flagA = typeof flagA !== "undefined" ? flagA : true;
console.log("flagA is set to " + (flagA ? "true" : "false"));
}
長いですが、常に機能し、理解しやすいです。
デフォルトの関数パラメーターのES6構文 を使用することもできますが、古いブラウザー(IEなど)では機能しないことに注意してください。これらのブラウザーをサポートする場合は、 Babel を使用してコードを変換する必要があります。
MDNの論理演算子 も参照してください。
タイトルが設定されていない場合、デフォルト値として「ERROR」を使用します。
より一般的な:
var foobar = foo || default;
読み取り:foobarをfoo
またはdefault
に設定します。これを何度も連鎖させることもできます。
var foobar = foo || bar || something || 42;
これについてもう少し説明します...
||
演算子は、logicalor
演算子です。最初の部分がtrueの場合、結果はtrueになり、2番目の部分がtrueであり、両方の部分がtrueの場合、trueになります。わかりやすくするために、ここに表を示します。
X | Y | X || Y
---+---+--------
F | F | F
---+---+--------
F | T | T
---+---+--------
T | F | T
---+---+--------
T | T | T
---+---+--------
ここで何か気づきましたか? X
がtrueの場合、結果は常にtrueです。したがって、X
がtrueであることがわかっている場合は、Y
をチェックする必要はまったくありません。したがって、多くの言語は、logical -or
(および他の方向から来るlogical -and
)の「短絡」評価器を実装します。彼らは最初の要素をチェックし、それが本当なら、彼らはまったく2番目のチェックを気にしません。結果は(論理的には)同じですが、実行に関しては、2番目の要素の計算に費用がかかる場合、大きな違いが生じる可能性があります。
それで、これはあなたの例と何の関係がありますか?
var title = title || 'Error';
それを見てみましょう。 title
要素が関数に渡されます。 JavaScriptでパラメーターを渡さない場合、デフォルトでnull値になります。また、JavaScriptで変数がnull値の場合、論理演算子によってfalseと見なされます。したがって、この関数がタイトルを指定して呼び出された場合、それは偽でない値であり、したがってローカル変数に割り当てられます。ただし、値が指定されていない場合、null値であるためfalseです。その後、logical -or
演算子は2番目の式を評価し、代わりに「エラー」を返します。そのため、ローカル変数には値「エラー」が与えられます。
これは、JavaScriptの論理式の実装により機能します。適切なブール値(true
またはfalse
)を返しませんが、代わりにtrue
と同等と見なされるものとfalse
と同等と見なされるものに関するいくつかのルールの下で与えられた値を返します。 JavaScript参照を調べて、ブール値のコンテキストでJavaScriptがtrueまたはfalseとみなすものを学習します。
基本的に、||の前の値がtrueと評価され、はいの場合はこの値を取り、そうでない場合は||の後の値を取ります。
||の後の値を取る値(私が覚えている限りでは):
二重パイプは論理「OR」の略です。これは、「パラメータが設定されていない」場合には当てはまりません。これは、次のようなコードがある場合、厳密にはjavascriptに含まれているためです。
function foo(par) {
}
その後、呼び出します
foo()
foo("")
foo(null)
foo(undefined)
foo(0)
同等ではありません。
ダブルパイプ(||)は最初の引数をブール値にキャストし、結果のブール値がtrueの場合は割り当てを行います。そうでない場合は、正しい部分を割り当てます。
これは、設定されていないパラメーターを確認する場合に重要です。
たとえば、1つのオプションパラメータを持つ関数setSalaryがあるとします。ユーザーがパラメーターを指定しない場合、デフォルト値の10を使用する必要があります。
このようなチェックを行う場合:
function setSalary(dollars) {
salary = dollars || 10
}
これにより、呼び出し時に予期しない結果が得られます
setSalary(0)
上記のフローに従って引き続き10を設定します。
私の前に述べたすべてに説明を加えるために、論理的な概念を理解するためにいくつかの例を挙げるべきです。
var name = false || "Mohsen"; # name equals to Mohsen
var family = true || "Alizadeh" # family equals to true
これは、左側が真のステートメントとして評価された場合、終了し、左側が返されて変数に割り当てられることを意味します。それ以外の場合は、右側が返されて割り当てられます。
And演算子は、以下のような逆の構造を持っています。
var name = false && "Mohsen" # name equals to false
var family = true && "Alizadeh" # family equals to Alizadeh
ダブルパイプ演算子
この例は便利ですか?
var section = document.getElementById('special');
if(!section){
section = document.getElementById('main');
}
することもできます
var section = document.getElementById('special') || document.getElementById('main');
Cletus 'answer は正しいものの、JavaScriptの「falseに評価する」に関して、さらに詳細を追加する必要があると感じています。
var title = title || 'Error';
var msg = msg || 'Error on Request';
Title/msgが提供されているかどうかだけでなく、どちらかが falsy であるかどうかもチェックしています。つまり、次のいずれかです。
- 偽。
- 0 (zero)
- ""(空の文字列)
- ヌル。
- 未定義。
- NaN(非数を意味する特別な数値!)
だから行に
var title = title || 'Error';
タイトルが真実である(つまり、偽りではないため、title = "titleMessage"など)場合、ブールOR(||)演算子は1つの 'true'値を見つけました。つまり、trueと評価されます。短絡し、真の値(タイトル)を返します。
タイトルが偽物(つまり上記のリストの1つ)である場合、ブールOR(||)演算子は 'false'値を見つけたため、演算子の他の部分である 'Errorを評価する必要があります'、trueと評価されるため、返されます。
オペレーターの両側がfalseと評価された場合、2番目の 'falsy'オペレーターを返します。
つまり.
return ("" || undefined)
未定義を返します。これは、おそらくデフォルトのタイトル/メッセージを「」にしようとするときに、この質問で尋ねられた動作を使用できるようにするためです。つまり、実行後
var foo = undefined
foo = foo || ""
fooは ""に設定されます
引用:「構造x = x || yはどういう意味ですか?」
デフォルト値の割り当て
これは、xがまだ値を待っているがまだ受け取っていないか、デフォルトにフォールバックするために意図的に省略された場合、yのデフォルト値をxに提供するを意味します。