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

你是对的,没有任务。这些语句利用&&运算符使用的优化。&&如果右手边和左手边都评估为真,则运算符评估为真。因此,如果左边是假的,它甚至不必检查右边,因为结果无论如何都是假的,根本不计算。

因此,这段代码:

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

如果第一部分为真,它只会评估表达式的第二部分。&& 是 JS 中的短路运算符 :) 有关详细信息,请参阅http://en.wikipedia.org/wiki/Short-circuit_evaluation 。

这些语句中的每一个都是单独评估的,但if (this.sides.??) buildPlane(..);为了代码清晰,每个语句都可以替换为。

于 2011-07-10T00:55:20.633 回答
1

实际上这个代码片段是 6 个语句,而不是一个表达式。每个语句都是一个表达式评估。

每个语句都是一个涉及&&运算符的布尔表达式。为了评估这些表达式,JavaScript 首先评估左侧部分,然后仅当左侧部分为真时,才评估第二部分。第二部分是一个有副作用的函数调用,没有“返回”。

以这种方式使用&&很常见。这是一种说“仅在条件为真时才调用此函数”的方式。

于 2011-07-10T00:56:58.560 回答
1

像这样的代码利用了短路,即逻辑与 ( &&) 和逻辑或 ( ||) 仅在相关的表达式的一侧执行。

说我有a && b。如果a是假的,a && b不管是什么总是假的,b所以不需要检查。同样,如果我有a || b,如果a为真,那么a || b无论是什么都始终为真,b因此不需要检查。

因此 Javascript 只检查a. 如果a碰巧是真的,那么它会检查b. 如果a碰巧是这样的形式(可能是我所知道的数字),那么他们正在检查数字是否!= 0. 如果是,则执行第二个代码块。此操作的返回值被丢弃,因为它没有被分配到任何地方。

于 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 回答