私はいくつかの JavaScript をデバッグしていますが、これが何をするのか説明できません||:
function (title, msg) {
  var title = title || 'Error';
  var msg   = msg || 'Error on Request';
}
こいつはなんで使ってるのvar title = title || 'ERROR'?var宣言なしでも時々見かけます。
私はいくつかの 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場合に評価されます。したがって、true の場合は、まったくチェックする必要はありません。これは短絡ブール評価と呼ばれるので、次のようになります。abtrueab
var title = title || "Error";
titleが に評価されるかどうかを基本的にチェックしfalseます。そうである場合は「戻り」"Error"、そうでない場合は を返しますtitle。
||) とは?二重パイプ演算子 ( ||) は論理OR演算子です。ほとんどの言語では、次のように機能します。
false、2 番目の値をチェックします。それが の場合は をtrue返しtrue、2 番目の値が の場合はfalseを返しますfalse。true、常に を返します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 は型付けが緩い言語であるため、少し異なります。この場合、||ブール値以外の値で operator を使用できることを意味します。意味はありませんが、この演算子を関数とオブジェクトなどで使用できます。
(function(){}) || {}
値が boolean でない場合、JavaScript は暗黙的に boolean に変換します。これは、値が false の場合 (例: 0、""、null( JavaScript のすべての falsey 値undefinedも参照))、 として扱われることを意味します。それ以外の場合は として扱われます。falsetrue
したがって、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。この場合、"Either x or y is truthy."if ywas true;を取得します。そうでなければ、あなたは得るでしょう"Neither x nor y is truthy"。
さて、演算子がどのように機能するかを知って||いれば、おそらく自分で何を意味するかを理解できるでしょうx = x || y。xが true の場合、xに割り当てられるためx、実際には何も起こりません。それ以外の場合yは に割り当てられxます。これは、関数で既定のパラメーターを定義するためによく使用されます。ただし、誤った値 (または であるとは限らない) をパラメーターとして渡すことができないため、多くの場合、不適切なプログラミング手法と見なされます。次の例を検討してください。undefinednull
function badFunction(/* boolean */flagA) {
  flagA = flagA || true;
  console.log("flagA is set to " + (flagA ? "true" : "false"));
}
一見有効に見えます。ただし、パラメーターfalseとして渡した場合はどうなるでしょうか(ブール値であるため、 orになる可能性があるため)。となります。この例では、 に設定する方法はありません。flagAtruefalsetrueflagAfalse
次のように である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;
これをもう少し説明すると…
operatorは||論理or演算子です。結果は、最初の部分が true の場合は true、2 番目の部分が true の場合は true、両方の部分が true の場合は true です。わかりやすくするために、次の表に示します。
 X | Y | X || Y 
---+---+--------
 F | F |   F    
---+---+--------
 F | T |   T    
---+---+--------
 T | F |   T    
---+---+--------
 T | T |   T    
---+---+--------
ここで何か気づきましたか?が true の場合X、結果は常に true です。したがって、それが真実であることがわかっている場合Xは、チェックする必要はまったくありませんY。orこのように、多くの言語は、logical- (およびand反対方向から来るlogical-)の「短絡」エバリュエーターを実装しています。彼らは最初の要素をチェックし、それが真であれば、2 番目の要素をまったくチェックしません。結果は (論理的には) 同じですが、2 番目の要素の計算にコストがかかる場合、実行に関しては大きな違いが生じる可能性があります。
それで、これはあなたの例と何の関係がありますか?
var title   = title || 'Error';
それを見てみましょう。要素が関数に渡されtitleます。JavaScript では、パラメーターを渡さない場合、デフォルトで null 値になります。また、JavaScript では、変数が null 値の場合、論理演算子によって false と見なされます。したがって、この関数がタイトルを指定して呼び出された場合、それは false ではない値であり、したがってローカル変数に割り当てられます。ただし、値が指定されていない場合は null 値になり、false になります。次に、論理or演算子は 2 番目の式を評価し、代わりに「エラー」を返します。したがって、ローカル変数には「エラー」という値が与えられます。
これは、JavaScript での論理式の実装により機能します。適切なブール値 (trueまたは) を返すのではなく、 と同等と見なされるものと と同等とfalse見なされるものに関するいくつかのルールの下で指定された値を返します。JavaScript リファレンスを参照して、ブール値のコンテキストで JavaScript が true または false と見なすものを確認してください。truefalse
||基本的に、 の前の値が 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 section = document.getElementById('special');
if(!section){
     section = document.getElementById('main');
}
次のこともできます。
var section = document.getElementById('special') || document.getElementById('main');
そして、もう 1 つ付け加えなければならないことがあります。偶発的なインタープリターの最適化 (最初の操作が真実である場合は 2 番目の操作を気にしない) を悪用して、代入を制御します。その使用は、オペレーターの目的とは何の関係もありません。私はそれが決して使われるべきではないと信じています。
初期化には三項演算子を好みます。たとえば、
var title = title?title:'Error';
これは、正しい目的のために 1 行の条件付き操作を使用します。それはまだ真実で見苦しいゲームをプレイしますが、それはあなたのための JavaScript です。