2012-07-24 56 views
6

我想知道爲什麼我在這裏得到一個無限循環。我只是不想傳遞這個初始值,所以如果他們是undefined他們會自動計算。它只是爲了清理我的函數調用,只使用一個參數。如果我通過它們,一切運行良好,過程結束。誰能幫忙?由於當我沒有定義參數時,爲什麼會出現無限循環?

function merge(array, lower, half, upper){ 
    //Suppressed for the sake of brevity 
} 

function mergeSort(array, lower, upper){ 
    if(!lower && !upper){ //take a look here 
     lower = 0; 
     upper = array.length - 1; 
    } 

    if(lower < upper){ 
     var half = Math.floor((lower + upper)/2); 

     mergeSort(array, lower, half); 
     mergeSort(array, half + 1, upper); 
     merge(array, lower, half, upper); 
    } 
} 

var array = [8, 3, 6, 4, 1, 0, 23, 12, 15, 63]; 
mergeSort(array); //infinite loop here 
console.log(array); 
+1

感謝您修復您的變量名稱。 :)你想'if(lower == undefined && upper == undefined)'而不是'if(!lower &&!upper)'。 – 2012-07-24 15:50:53

+0

@ElliotBonneville看看我的合併功能現在看起來如何; https://gist.github.com/3165423 - 你可以留下評論在改進的要點頁!感謝積極的批評! =) – renatoargh 2012-07-24 15:58:21

回答

7

您對mergeSort第一個遞歸調用傳遞它作爲0第一個參數,因爲你設置它這樣。

因爲!0也使用typeof操作

if(typeof lower === 'undefined' && typeof upper === 'undefined'){ //take a look here 
    lower = 0; 
    upper = array.length - 1; 
} 

,或者甚至更好,檢查arguments.length演算值爲false,在這裏你去..對undefined

最好先檢查一下,像

if(arguments.length === 1) { 
    var lower = 0, 
     upper = array.length -1 ; 
} 
+0

感謝@jAndy,運算符== /!=執行的類型轉換剛剛引起我的興趣......您如何看待if(lower == undefined && upper == undefined)和/或'if(lower === undefined && upper === undefined)'? – renatoargh 2012-07-24 15:55:11

+0

@RenatoGama:如果你的論點總是被宣告的話,那就好了。通過檢查'arguments.length'你甚至不需要這個需求。但這完全是一個味道的問題:-) – jAndy 2012-07-24 15:58:06

相關問題