0

Three.js から:

this.sides.px && buildPlane( 'z', 'y',   1 * flip, - 1, depth, height, - width_half, this.materials[ 0 ] ); // px
this.sides.nx && buildPlane( 'z', 'y', - 1 * flip, - 1, depth, height, width_half, this.materials[ 1 ] );   // nx
this.sides.py && buildPlane( 'x', 'z',   1 * flip,   1, width, depth, height_half, this.materials[ 2 ] );   // py
this.sides.ny && buildPlane( 'x', 'z',   1 * flip, - 1, width, depth, - height_half, this.materials[ 3 ] ); // ny
this.sides.pz && buildPlane( 'x', 'y',   1 * flip, - 1, width, height, depth_half, this.materials[ 4 ] );   // pz
this.sides.nz && buildPlane( 'x', 'y', - 1 * flip, - 1, width, height, - depth_half, this.materials[ 5 ] ); // nz

このブール式は何を返しますか? ブール値を返す場合、どこに行きますか? (割り当てが表示されません!) どのように評価されますか?

4

5 に答える 5

3

割り当てがないというのは正しいです。これらのステートメントは、オペレーターが使用する最適化を利用し&&ます。&&右側と左側の両方が true と評価される場合、演算子は true と評価されます。したがって、左辺が false の場合、結果はいずれにせよ false になり、まったく評価されないため、右辺をチェックする必要さえありません。

したがって、このコード:

this.sides.px && buildPlane( 'z', 'y',   1 * flip, - 1, depth, height, - width_half, this.materials[ 0 ] ); // px

は、次のコードと同等です。

if (this.sides.px) {
    buildPlane( 'z', 'y',   1 * flip, - 1, depth, height, - width_half, this.materials[ 0 ] );
}
于 2011-07-10T00:58:18.053 に答える
2

最初の部分が true の場合、式の 2 番目の部分のみを評価します。&& は JS の短絡演算子です :) 詳細については、http://en.wikipedia.org/wiki/Short-circuit_evaluationを参照してください。

これらの各ステートメントは個別に評価されますがif (this.sides.??) buildPlane(..);、コードを明確にするためにそれぞれを に置き換えることができます。

于 2011-07-10T00:55:20.633 に答える
1

実際、このコード スニペットは 6 つのステートメントであり、単一の式ではありません。各ステートメントは式の評価です。

&&各ステートメントは、演算子を含むブール式です。これらの式を評価するために、JavaScript は最初に左側の部分を評価し、次に左側の部分が true の場合にのみ、2 番目の部分を評価します。2 番目の部分は、副作用のある関数呼び出しで、何も「返されません」。

このように を使用するの&&が一般的です。「条件が真の場合にのみこの関数を呼び出す」という言い方です。

于 2011-07-10T00:56:58.560 に答える
1

このようなコードは、ショート サーキットを利用しています。これは、logical and ( &&) と logical or ( ||) が関連する場合にのみ式の側を実行するという事実です。

私が持っているとしましょうa && b。false の場合aは、a && bbがあっても常に false であるため、チェックする必要はありません。同様に if I have a || b, if ais true, thena || bは常に truebであるため、チェックする必要はありません。

したがって、Javascript は のみをチェックしますaaたまたま true の場合、チェックしますb。たまたまそのような形式になっている場合a(おそらく私が知る限りの数字)、彼らはその数字が!= 0. はいの場合、2 番目のコード ブロックを実行します。この操作の戻り値は、どこにも割り当てられていないため破棄されます。

于 2011-07-10T01:00:35.770 に答える
0

これ:

this.sides.px && buildPlane( 'z', 'y',   1 * flip, - 1, depth, height, - width_half, this.materials[ 0 ] );

これと同じ結果が得られます:

if (this.sides.px) {
   buildPlane( 'z', 'y',   1 * flip, - 1, depth, height, - width_half, this.materials[ 0 ] );
}

数行のコードを節約できますが、ifステートメントを使用する場合と比べて、誰にとっても明確ではないかもしれません。

于 2011-07-10T00:59:55.817 に答える