2015-05-28 28 views
9

ho notato qualcosa di strano, mentre la revisione this mergesort implementation on Code Review ...Questo mergesort dovrebbe "of" fallito, giusto?

/************************************************************ 
 
* 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>

L'ultimo ramo condizionale è else of piuttosto che else if. Normalmente, else of dovrebbe causare un errore di sintassi. Tuttavia, non importa quanto ci provi, non riesco ad attivare l'errore di sintassi: restituisce sempre un array ordinato in ordine decrescente!

Lo so, else of (b == 0) potrebbe essere sostituito da else, ma ancora, voglio sapere: come potrebbe funzionare questo codice?

+0

Il codice funziona per me. –

+0

funziona bene su cromo ... – Vogel612

risposta

4

Questo funziona a causa di una combinazione di 2 "cose ​​cattive" su Javascript: tralasciando le parentesi graffe nelle istruzioni di blocco che contengono solo una singola istruzione e semicolon insertion.

tuo if dichiarazione, opportunamente rinforzato, dovrebbe essere simile a questo:

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; 
} 

ma, a causa delle parentesi graffe mancanti e inserimento virgola, Javascript è vedere/analisi come questo:

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; 

Se si passa sempre legittimamente negli array left e, questo ultimo ramo else non viene mai raggiunto, quindi perché non si è vista un'eccezione.

Se si passa in un right array vuoto, raggiungerà l'ultimo ramo e gettare of is not a function:

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

Qualsiasi standard di codifica rispettabile dovrebbe richiedere esplicitamente queste 2 "caratteristiche" di Javascript mai essere usato ... ma questa è solo un'opinione.

+1

La parte 'else of' 'non equivale' else {of (b == 0)} return left; '? – Siguza

+0

Se qualcosa, sarebbe 'else (di (b == 0)) {return left; } ' –

+1

Da quando' else' prende gli argomenti? Non è come se fosse un 'else if' ... – Siguza

3

of è una parola chiave in ES6, utilizzato per iterare su oggetti .. ma in questo caso il of si comporta come funzione non parola chiave ..

Il codice funzione non va mai a else of (b == 0) return left; parte .. quindi compilatore non gettare ReferenceError: of is not defined

se si vuole cambiare of parola chiave in un altro parola come else often(b==0).... poi anche il lavoro codice

quando si invia destra vuota allora codice lancerà erro r ReferenceError: of is not defined, quindi finalmente questo è solo errore di battitura.