2013-03-25 32 views
1

給出一個數字,程序應該返回一個僅使用* 3或+5的操作序列來獲得數字,因此有兩條路徑可以使用。該程序如何知道調用自己時要調用哪個函數?它是如何知道多少次調用每條路徑的。換句話說,我不明白如何使用OR運營商來確定使用find()的哪個呼叫以及每個呼叫的數量。OR操作符在這個JavaScript中如何工作?

function findSequence(goal) { 
    // we start at 1, and history is a string that will keep track of the operations 
    function find(start, history) { 
     // case when start and goal is 1. 
     if (start == goal) 
      return history; // return string containg 1 
     // case when we build start past what we needed 
     else if (start > goal) 
      return null; 
     else 
      // Dont understand this part! 
      return find(start + 5, "(" + history + " + 5)") || 
       find(start * 3, "(" + history + " * 3)"); 
    } 
    return find(1, "1"); 
} 

document.write(findSequence(13)); 
+0

在這裏有一個類似的問題http:// stackoverflow。com/questions/2966430/why-does-javascripts-or-return-a-value-other-than-true-false其中有一些有用的信息。 – 2013-03-25 16:39:12

回答

3

||操作檢查左操作數的真值。有趣的是,||表達式不會評估爲truefalse。如果真值爲真,則表達式評估爲左操作數。如果不是,則它評估爲正確的操作數。例如:

> 5 || 10 
5 
> 5 || 0 
5 
> 0 || 10 
10 
> 0 || undefined 
undefined 

因此a || b實際上相當於a ? a : b。類似地,a && b實際上相當於a ? b : a:在JavaScript specification確定

> 0 && 10 
0 
> 0 && undefined 
0 
> 5 && 10 
10 
> 5 && undefined 
undefined 

非布爾值真值:

  • 未定義 - >假
  • 空 - >假
  • 字符串 - >假如爲空字符串,否則爲真
  • 對象>真

編輯:哦,因爲mattedgod指出,只要表達式求結果,表達式的其餘部分沒有得到根本評估。例如:

> function fail() { throw "I failed!"; } 
> fail() 
XXX "I failed!" 
> 5 || fail() 
5 
> 0 && fail() 
0 

沒有故障發生在上述情況下,但在下面,他們做到:

> 0 || fail() 
XXX "I failed!" 
> 5 && fail() 
XXX "I failed!" 

因此,如果你有兩個呼叫find()find(...) || find(...),如果第一個結果調用具有真實的真值,那麼它的結果將被返回,第二個將不會執行。如果第一次調用的結果具有錯誤的真值,則第二次調用將執行,並且表達式計算出結果是什麼。

2

這是依賴JavaScript(以及許多其他語言)稱爲「短路」的屬性。

如果你考慮一下,如果你正在評估某件事情是真的,那麼它是A || B,如果A是真的,那麼整個表達式就是真的,沒有意義檢查B.對於&& if A是錯誤的,你正在評估A && B,整個表達式爲false,所以沒有任何意義與B.

懶得在你的榜樣,如果find第一調用成功,它不會執行第二個。但是,如果第一次調用不成功(我猜測它返回false或null或者結果爲JS false),第二次調用將被執行。

相關問題