編集 : 引用を削除しました。質問とは関係ありません。
質問
(すべてが真実である場合) 常に最後の値を取るのはなぜですか?
例:
f= 1 && 2 && 3 //3
f= 'k' && 'd' && 's' //'s'
ps : $.callbacksを使用して pub/sub を調査しているときに気付きました
編集 : 引用を削除しました。質問とは関係ありません。
質問
(すべてが真実である場合) 常に最後の値を取るのはなぜですか?
例:
f= 1 && 2 && 3 //3
f= 'k' && 'd' && 's' //'s'
ps : $.callbacksを使用して pub/sub を調査しているときに気付きました
演算子はif ステートメント&&
として機能します。短絡は、値が falseの場合にのみ発生します。それ以外の場合は、ステートメントの評価を続けます。
あなたが書くとき、それは次のa && b
ことを意味します:a ? b : a
. 同様に、次のa || b
ことを意味しますa ? a : b
。
ECMAScript 標準には、12.11.2 ランタイム セマンティクス: 評価と記載されています。
LogicalANDExpression : LogicalANDExpression && BitwiseORExpression
1. Let lref be the result of evaluating LogicalANDExpression.
2. Let lval be GetValue(lref).
3. Let lbool be ToBoolean(lval).
4. ReturnIfAbrupt(lbool).
5. If lbool is false, return lval.
6. Let rref be the result of evaluating BitwiseORExpression.
7. Return GetValue(rref).
つまり、最初に、最初のオペランドが「偽の」値 ( null
、false
、0
) であると評価されるかどうかを確認します。そうであれば、最初のオペランドが返されます。
ただし、「thruthy」の場合は、同じプロセスが第 2 オペランドに対して繰り返され、真の値として評価された場合は、元の値が返されます ( 7. Return GetValue(rref)
)。
短絡評価と bool の代わりに 2 番目の式を返すことは、非常に便利な機能です。
演算子は左側の&&
オペランドを評価し、真であれば右側のオペランドを評価します。同様に、||
演算子は左側のオペランドを評価し、偽の場合は右側のオペランドを評価します。
これにより、次のようなものを書くことができます
draw_element(color || "#F00");
color
指定されていない場合 ( color
is null
、undefined
or など) を除き、 using の意味で""
あり、その場合、デフォルト値が使用されます。
次のようなものを使用することもできます
draw_element(color || pick_new_color());
この関数pick_new_color()
は、色が指定されていない場合にのみ呼び出されます。
代わりの非常に一般的な使用法は&&
、エラーを回避することです。次に例を示します。
if (x && x.constructor == Array) {
...
}
x
属性にアクセスできない場合 (アクセスしようとすると例外が発生します) null
。ただの代わりに最初の結果を返すundefined
という事実は、実際にはあまり役に立ちません。あなたのコード例はそれを行いますが、Javascript プログラムでよく見られるものではありません。&&
falsy
false
要約する&&
と、 and||
はショートサーキットです (つまり、最初のオペランドを評価した後に結果がわかっている場合、2 番目のオペランドを評価することさえありません)。これは非常に便利です。また、bool の代わりに偽/真実の値自体を返します。これは非常に便利です||
(あまり役に立ちません&&
)。