web-dev-qa-db-ja.com

割り当て内のJavascript AND演算子

私はJavaScriptであなたができることを知っています:

var oneOrTheOther = someOtherVar || "these are not the droids you are looking for...";

ここで、変数oneOrTheOtherは、nullundefined、またはfalseではない場合、最初の式の値を取ります。その場合、2番目のステートメントの値に割り当てられます。

しかし、論理AND演算子を使用すると、変数oneOrTheOtherは何に割り当てられますか?

var oneOrTheOther = someOtherVar && "some string";

someOtherVarが偽でない場合はどうなりますか?
someOtherVarがfalseの場合はどうなりますか?

JavaScriptを学ぶだけで、AND演算子と組み合わせた代入で何が起こるか知りたいです。

64
Alex

基本的に、論理AND演算子(&&)は、最初のオペランドがtruthyの場合は2番目のオペランドの値を返し、それ自体がfalsyの場合は最初のオペランドの値を返します。例:

true && "foo"; // "foo"
NaN && "anything"; // NaN
0 && "anything";   // 0

falsyの値は、ブールコンテキストで使用するとfalseに強制変換される値であり、nullundefined0NaN、空の文字列、そしてもちろんfalseは、他のすべてがtrueに強制変換されます。

75
CMS

&&guard演算子と呼ばれることもあります。

variable = indicator && value

指標が真実である場合にのみ、値を設定するために使用できます。

23
mykhal

引用 Douglas Crockford1

&&演算子は、最初のオペランドが偽の場合、最初のオペランドの値を生成します。それ以外の場合は、第2オペランドの値を生成します。


1 Douglas Crockford: JavaScript:The Good Parts -16ページ

18
Daniel Vassallo

初心者の例

「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演算子

実用化されている他の便利な奇妙な割り当ては、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の回文チェック

ハッピーコーディング。

12
Jason Sebring

注釈付き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の場合:「これらは探しているドロイドではありません...移動してください」を返します。

1
BatScream

私はここで&&が割り当てステートメントのために仕事で酷使されているのを見てきました。懸念事項は2つあります。1)「インジケーター」チェックは、開発者が考慮しないオーバーヘッドのある機能である場合があります。 2)開発者が安全チェックとしてそれを見るだけで、varにfalseを割り当てているとは考えないのは簡単です。私は彼らにタイプセーフな態度を持たせるのが好きなので、彼らにこれを変えてもらいます:

var currentIndex = App.instance && App.instance.rightSideView.getFocusItemIndex();

これに:

var currentIndex = App.instance && App.instance.rightSideView.getFocusItemIndex() || 0;

期待どおりに整数を取得します。

0
Drew Deal