2015-05-28 17 views
9

zauważyłem coś dziwnego podczas przeglądania this mergesort implementation on Code Review ...To połączenie powinno zakończyć się niepowodzeniem, prawda?

/************************************************************ 
 
* Mergesort implementation 
 
***********************************************************/ 
 

 
function sort(array) { 
 
    var len = array.length; 
 
    var middle = Math.floor(len*0.5); 
 
    var left = array.slice(0,middle); 
 
    var right = array.slice(middle, len); 
 

 
    if (len == 1) { 
 
    return array; 
 
    } else { 
 

 
    } 
 

 
    return merge(sort(left), sort(right)); 
 
} 
 

 

 
function merge(left, right) { 
 
    var a = left.length; 
 
    var b = right.length; 
 

 

 
    if (a > 0 && b > 0) { 
 
    if (left[0] > right[0]) { 
 
     return [].concat(left[0], merge(left.slice(1,a), right)); 
 
    } else { 
 
     return [].concat(right[0], merge(right.slice(1,b), left)); 
 
    } 
 
    } else if (a == 0) { 
 
    return right; 
 
    } else of (b == 0) 
 
    return left; 
 

 
} 
 

 

 
/************************************************************ 
 
* Demonstration 
 
***********************************************************/ 
 

 
function doSort() { 
 
    var array = document.getElementById('in').value.split(/[, ]+/).map(function(e) { 
 
     return parseInt(e); 
 
    }); 
 
    var sorted = sort(array); 
 
    document.getElementById('out').value = sorted; 
 
} 
 

 
function generateRandom(len) { 
 
    var array = []; 
 
    for (var i = 0; i < len; i++) { 
 
     array.push(Math.round(Math.random() * 100)); 
 
    } 
 
    document.getElementById('in').value = array; 
 
}; 
 

 
generateRandom(20);
<button onclick="generateRandom(20)">⬇︎ Generate random numbers ⬇︎</button> 
 
<div><input id="in" size="80"></div> 
 
<button onclick="doSort()">⬇︎ Sort ⬇︎</button> 
 
<div><input id="out" size="80" disabled></div>

Ostatni skok warunkowy jest else of zamiast else if. Normalnie else of powinien powodować błąd składni. Jednak bez względu na to, jak bardzo się staram, nie mogę wywołać błędu składni - zawsze z powodzeniem zwraca tablicę posortowaną w malejącej kolejności!

Wiem, else of (b == 0) może zostać zastąpiony przez else, ale nadal chcę wiedzieć: Jak ten kod mógł działać?

+0

Kod doesent działa dla mnie. –

+0

działa dobrze na chromie ... – Vogel612

Odpowiedz

4

Działa to z powodu kombinacji 2 "złych rzeczy" dotyczących kodu JavaScript: pomijania klamr w instrukcjach blokowych zawierających tylko jedną instrukcję i semicolon insertion.

Twój if oświadczenie, odpowiednio usztywnione, powinien wyglądać następująco:

if (a > 0 && b > 0) { 
    if (left[0] > right[0]) { 
     return [].concat(left[0], merge(left.slice(1,a), right)); 
    } else { 
     return [].concat(right[0], merge(right.slice(1,b), left)); 
    } 
} else if (a == 0) { 
    return right; 
} else of (b == 0) { 
    return left; 
} 

ale z powodu brakujących szelki i wstawiania średnik, JavaScript widzi/parsowania to tak:

if (a > 0 && b > 0) { 
    if (left[0] > right[0]) { 
     return [].concat(left[0], merge(left.slice(1,a), right)); 
    } else { 
     return [].concat(right[0], merge(right.slice(1,b), left)); 
    } 
} else if (a == 0) { 
    return right; 
} else { 
    of(b == 0); 
} 

return left; 

Jeśli zawsze przekazujesz prawidłowe tablice left i right, ta ostatnia gałąź else nigdy nie zostanie osiągnięta, dlatego nie widzisz wyjątku.

Jeśli przechodzą w pustym right tablicy osiągnie ostatnią gałąź i rzucać of is not a function:

merge([10, 20, 30], []); 

Każdy porządny standardem kodowania powinny wyraźnie wymagają te „cechy” 2 nigdy Javascript być wykorzystane ... ale to tylko jedna opinia.

+1

Czyżby część "else of" nie była równa 'else {of (b == 0)} w lewo;'? – Siguza

+0

Jeśli cokolwiek, byłoby to "else (of (b == 0)) {return left; } ' –

+1

Od kiedy" else "bierze jakieś argumenty? To nie jest tak, że to 'else if' ... – Siguza

3

of jest kluczowe w ES6, używany do iteracji po obiektach .. ale w tym przypadku of zachowuje się jak funkcja nie słowa kluczowego ..

Kod funkcji nigdy nie idzie do else of (b == 0) return left; części .. więc kompilator nie rzucać ReferenceError: of is not defined

jeśli zmienisz of słowa kluczowego w innym słowem jak else often(b==0).... następnie również praca kod

podczas wysyłania prawy bok pusty następnie kod rzuci erro r ReferenceError: of is not defined, więc w końcu jest to tylko literówka.

Powiązane problemy