这个布尔表达式如何评估?

时间:2011-07-10 00:51:59

标签: javascript boolean-expression

From 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

这个布尔表达式返回什么?如果它返回一个布尔值,它会去哪里? (我看不到作业!)它是如何评价的?

5 个答案:

答案 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语句相比,可能并不是每个人都清楚。