2011-03-03 53 views
1

取自box2djs樣本。在下面的JavaScript函數中,||是什麼運營商呢?

我想了解的庫,但我不明白這行:

ballSd.radius = rad || 10; 

這是什麼意思?

下面是完整的定義

createBall2 = function(world, x, y, rad, fixed) { 
    var ballSd = new b2CircleDef(); 
    if (!fixed) ballSd.density = 1.0; 

    // what does the next line do? 
    ballSd.radius = rad || 10; 

    ballSd.restitution = 0.2; 
    var ballBd = new b2BodyDef(); 
    ballBd.AddShape(ballSd); 
    ballBd.position.Set(x,y); 
    return world.CreateBody(ballBd); 
}; 

回答

2

在JavaScript布爾表達式不返回falsetrue,但其確定表達的結果的第一操作數(從左至右)。

當使用邏輯OR ||,這是計算結果爲true第一個操作數(類似地,其值false&&第一操作數)。如其他人已經注意到的,如果rad評估爲false(例如,如果它是0),則返回第二操作數。

這個「竅門」通常用於設置默認值。

Read more about logical operators.


†:那只是66.6%的正確。 NOT運算符!將始終返回布爾值。

+0

這不是第一個操作數從左至右決定勝負。在OP的例子中,第一個操作數可以是一個字符串,但如果它不是「falsy」,表達式會返回一個數字。它是導致比較短路返回的操作數。如果沒有操作數將比較短路,則返回最後一個操作數。 '!'因爲它是一個一元操作符,所以在這裏並不重要。 –

+0

@Juan Mendes:我會說這是一樣的。不知道你想用字符串示例告訴我什麼。當然,如果'rad'是一個空字符串,它不會確定結果。返回'10'。如果它不是空字符串,則會返回。請注意,如果它是0 *,我寫了***例如**。如果最後的操作數被返回,那麼它是第一個決定結果的結果,因爲之前所有的結果都沒有。 –

+0

現在我明白你的意思了。我很困惑,因爲你的第一句話含糊不清,再讀一遍......「第一個操作數(從左到右)決定了表達的結果。」如果它表示類似「第一個操作數(從左到右)短路比較確定表達式的結果」,則會更清楚。 –

4
ballSd.radius = rad || 10; 

意味着:如果rad == true(或truthy)返回弧度的值,否則返回10

0

如果弧度是假或0,設置ballSd.radius至10

+1

或' 「」','NaN',... –

0

設置圓弧半徑爲給定參數「rad」(如果給出的話)並且大於零,否則設爲10,這使得它成爲默認半徑。

0

請參閱this ...因此,如果rad變量的值轉換爲布爾值爲true,則返回rad,否則返回10; 任何變量都可以轉換爲布爾值: null,0,undefined將被轉換爲false;未定義的 將被轉換爲true; 看到implicit boolean conversions in javascript

1

所有的答案都是正確的,但是他們缺少對JavaScript中的&&||運算符的解釋。訣竅是它們不返回布爾值,它們返回比較短路的值。

例如

// Returns the first truthy value (2) since after looking at 0 and 2, we already 
// know the expression is true and we don't need to evaluate the last component (3) 
alert (0 || 2 || 3) 

// Returns the first falsy value (""), the comparison doesn't even 
// evaluate "Hello" and "Dog" 
alert("" && "Hello" && "Dog"); 

// No short circuiting, so the last value ("fun") is returned 
alert("string" && "fun")