私はJavaScriptであなたができることを知っています:
var oneOrTheOther = someOtherVar || "these are not the droids you are looking for...";
ここで、変数oneOrTheOther
は、null
、undefined
、またはfalse
ではない場合、最初の式の値を取ります。その場合、2番目のステートメントの値に割り当てられます。
しかし、論理AND演算子を使用すると、変数oneOrTheOther
は何に割り当てられますか?
var oneOrTheOther = someOtherVar && "some string";
someOtherVar
が偽でない場合はどうなりますか?someOtherVar
がfalseの場合はどうなりますか?
JavaScriptを学ぶだけで、AND演算子と組み合わせた代入で何が起こるか知りたいです。
基本的に、論理AND演算子(&&
)は、最初のオペランドがtruthyの場合は2番目のオペランドの値を返し、それ自体がfalsyの場合は最初のオペランドの値を返します。例:
true && "foo"; // "foo"
NaN && "anything"; // NaN
0 && "anything"; // 0
falsyの値は、ブールコンテキストで使用するとfalse
に強制変換される値であり、null
、undefined
、0
、NaN
、空の文字列、そしてもちろんfalse
は、他のすべてがtrue
に強制変換されます。
&&
はguard演算子と呼ばれることもあります。
variable = indicator && value
指標が真実である場合にのみ、値を設定するために使用できます。
引用 Douglas Crockford1:
&&
演算子は、最初のオペランドが偽の場合、最初のオペランドの値を生成します。それ以外の場合は、第2オペランドの値を生成します。
1 Douglas Crockford: JavaScript:The Good Parts -16ページ
「user.name」にアクセスしようとしているが、これが発生した場合:
Uncaught TypeError: Cannot read property 'name' of undefined
恐れるな。これは、割り当てで&&演算子を使用するか、未定義のエラーから「ガード」するため、guard演算子と呼ばれることで解決できます。ハプニング。
奇妙に思われるかもしれませんが、後で説明するように読み続けてください。
var user = undefined;
var username = user && user.username;
// no error, "username" assigned value of "user" which is undefined
user = { username: 'Johnny' };
username = user && user.username;
// no error, "username" assigned 'Johnny'
user = { };
username = user && user.username;
// no error, "username" assigned value of "username" which is undefined
説明:ガード操作では、各項が左から右に一度に評価されます。評価された値が偽である場合、評価は停止し、その値が割り当てられます。最後のアイテムに到達すると、それが偽物であるかどうかに関係なく割り当てられます。
falsyは、これらの値のいずれかであることを意味しますundefined, false, 0, null, NaN, ''
およびtruthyは、偽りではないことを意味します。
Guardメソッドの簡単なボタン
Lodashの美しいガード演算子を使用して、次のようにネストされたデータにアクセスします。
// need to access obj.has.some.very.nested.stuff
var val = _.get(obj, 'has.some.very.nested.stuff');
フードの下で&&を処理する一方で、便利な方法で使用すると便利です。 Lodash _.getソースコード
実用化されている他の便利な奇妙な割り当ては、OR演算子です。これは通常、次のようなプラグインに使用されます。
this.myWidget = this.myWidget || (function() {
// define widget
})();
これは、「this.myWidget」が偽の場合にのみコード部分を割り当てます。プラグインを使用している人が誤ってスクリプトタグsrcを複数回宣言している可能性があるため、コードが割り当てられていてもいなくても、気にしないでどこでも何度でも宣言できるため便利です。
説明:各値は、左から右に1つずつ評価されます。値が真である場合、評価を停止してその値を割り当てます。そうでない場合は続行し、最後の項目に到達すると、それが偽であるかどうかに関係なく割り当てられます。
これで究極のパワーが得られ、回文で使用するという非常に奇妙な例など、非常に奇妙なことができます。
function palindrome(s,i) {
return (i >= s.length/2) || (s[i] === s[s.length -1 - i]) && palindrome(s, ++i);
}
詳細な説明はこちら: Javascriptの回文チェック
ハッピーコーディング。
注釈付きECMAScript 5.1セクション11.11 によれば:
論理OR演算子(||)の場合、
expr1 || expr2 trueに変換できる場合、expr1を返します。それ以外の場合は、expr2を返します。したがって、ブール値とともに使用すると、||いずれかのオペランドがtrueの場合はtrueを返します。両方がfalseの場合、falseを返します。
与えられた例では、
var oneOrTheOther = someOtherVar || 「これらはあなたが探しているドロイドではありません...一緒に進んでください」;
ブール(someOtherVar)がtrueの場合、結果はsomeOtherVarの値になります。(参照してください。 式の真実性 )。それが偽である場合、結果は「これらはあなたが探しているドロイドではありません...一緒に進んでください」です。
そして、論理AND演算子(&&)の場合、
Falseに変換できる場合はexpr1を返します。それ以外の場合は、expr2を返します。したがって、ブール値とともに使用すると、両方のオペランドがtrueの場合、&&はtrueを返します。それ以外の場合はfalseを返します。
与えられた例では、
ケース1:Boolean(someOtherVar)がfalseの場合:someOtherVarの値を返します。
ケース2:Boolean(someOtherVar)がtrueの場合:「これらは探しているドロイドではありません...移動してください」を返します。
私はここで&&が割り当てステートメントのために仕事で酷使されているのを見てきました。懸念事項は2つあります。1)「インジケーター」チェックは、開発者が考慮しないオーバーヘッドのある機能である場合があります。 2)開発者が安全チェックとしてそれを見るだけで、varにfalseを割り当てているとは考えないのは簡単です。私は彼らにタイプセーフな態度を持たせるのが好きなので、彼らにこれを変えてもらいます:
var currentIndex = App.instance && App.instance.rightSideView.getFocusItemIndex();
これに:
var currentIndex = App.instance && App.instance.rightSideView.getFocusItemIndex() || 0;
期待どおりに整数を取得します。