2011-07-10 93 views
0

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 

這是什麼布爾表達式的回報?如果它返回一個布爾值,它會去哪裏? (我看不到任務!)它如何評估?

回答

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 ]); 
} 
+1

如果雙方都是「真理」,技術上'&&將評估爲右操作數的價值,不一定是真實的,但這裏的結果是相同的因爲結果被忽略了。 – user113716

2

只有在第一部分爲真的情況下才會轉移表達式的第二部分。 & &是JS中的短路操作員:)有關更多詳細信息,請參閱http://en.wikipedia.org/wiki/Short-circuit_evaluation

這些語句都單獨評估,但爲了清晰起見,每個語句都可以替換爲if (this.sides.??) buildPlane(..);

+1

其實,不,buildPlane不必返回一個布爾值來使這個工作在JavaScript中。 JavaScript是弱類型的。 –

+0

確實buildPlane函數返回一個布爾值?我沒有看到它的定義返回關鍵字.. – DrStrangeLove

+0

我更新了答案。不知道它是如何工作在JS :) –

1

實際上這段代碼是6條語句,而不是單個表達式。每個陳述都是一種表達評估。

每條語句都是一個涉及&&運算符的布爾表達式。爲了評估這些表達式,JavaScript首先評估左側部分,然後僅在左側部分爲真時評估第二部分。第二部分是一個有副作用的函數調用,沒有任何「返回」。

以這種方式使用&&是常見的。這是一種說法,「只有在條件成立的情況下才能調用此函數」。

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語句的人而言可能並不清楚。

1

代碼像是取短路的優點,但事實上,邏輯與(&&)和邏輯或(||)僅執行表達式的側如果它們是相關的。假設我有a && b。如果a爲假,則無論b是什麼,a && b總是爲假,因此不需要檢查。同樣,如果我有a || b,如果a爲真,那麼a || b始終爲真,無論b是什麼,都不需要檢查。

因此,Javascript只檢查a。如果a碰巧是真的,那麼它檢查b。如果a恰好處於這樣的形式(可能是我所知道的數字),那麼他們正在檢查數字是否爲!= 0。如果是,則執行第二個代碼塊。這個操作的返回值被丟棄,因爲它沒有被分配到任何地方。