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
这个布尔表达式返回什么?如果它返回一个布尔值,它会去哪里? (我看不到作业!)它是如何评价的?
答案 0 :(得分:3)
你是对的,没有任务。这些语句使用&&
运算符使用的优化。如果右侧和左侧都评估为true,则&&
运算符的计算结果为true。因此,如果左侧是假的,它甚至不必检查右侧,因为结果将是假的,并且根本不进行评估。
因此,这段代码:
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 ] );
}
答案 1 :(得分:2)
如果第一部分为真,它只会破坏表达式的第二部分。 &安培;&安培;是JS中的短路运算符:)有关详细信息,请参阅http://en.wikipedia.org/wiki/Short-circuit_evaluation。
这些陈述中的每一个都是单独评估的,但为了代码清晰,每个陈述都可以替换为if (this.sides.??) buildPlane(..);
。
答案 2 :(得分:1)
实际上,此代码段是6个语句,而不是单个表达式。每个陈述都是表达式评估。
每个语句都是一个涉及&&
运算符的布尔表达式。要评估这些表达式,JavaScript首先评估左侧部分,然后仅在左侧部分为真时评估第二部分。第二部分是一个副作用的函数调用,没有任何“返回”。
以这种方式使用&&
很常见。这是一种说法“只有在条件成立时才调用此函数。”
答案 3 :(得分:1)
这样的代码利用了短路,逻辑和(&&
)和逻辑或(||
)只执行表达式的这一事实是相关的。
说我有a && b
。如果a
为false,则a && b
始终为false,无论b
是什么,因此不需要进行检查。同样,如果我有a || b
,如果a
为真,则a || b
始终为真,无论b
是什么,因此不需要进行检查。
因此,Javascript只会检查a
。如果a
恰好为真,那么它会检查b
。如果a
恰好是这样的形式(可能是我能说的数字),那么他们正在检查数字!= 0
。如果是,则执行第二个代码块。此操作的返回值将被丢弃,因为它未在任何位置分配。
答案 4 :(得分: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
语句相比,可能并不是每个人都清楚。