2017-02-03 5 views
0

Also diesen Sortieralgorithmus ist etwas, was ich von hier abgezogen habe und ich versuche nur, meinen Kopf einzuwickeln, wie es funktioniert. Wenn ich alert(i) in diese Position setze, wird es alle fünfmal wie erwartet warnen.Was verursacht dieses seltsame Shuffle-Algorithmus-Verhalten?

function shuffle(a) { 
    for (let i = a.length; i; i--) { 
     alert(i) 
     let j = Math.floor(Math.random() * i); 
     [a[i - 1], a[j]] = [a[j], a[i - 1]]; 
    } 
} 

Aber wenn ich es in dieser Position setze es nur einmal warnt.

function shuffle(a) { 
    for (let i = a.length; i; i--) { 
     let j = Math.floor(Math.random() * i); 
     alert(i) 
     [a[i - 1], a[j]] = [a[j], a[i - 1]]; 
    } 
} 

Was verursacht das? Läuft die Schleife nicht noch 5 Mal?

+0

Ich dachte, es injiziert Semikolons. Was macht es, dass es nur einmal Alarm ruft? –

+0

Die automatische Semikolon-Assertion ist etwas defekt, verwenden Sie immer nur Semikolons. Hit F12, um zu sehen, was den Code bricht ... – Teemu

+0

Ich versuchte Ihren Code (mit Semikolon). Ich bekomme die gleiche Menge an Warnungen. [IE -> F12 drücken] | [Chrome -> Strg + Umschalt + I] | [Firefox -> Ctrl + Shift + Q] – Marcus

Antwort

2

Die einfache Antwort ist, dass die versäumte Semikolon nach dem alert das Problem verursacht:

function shuffle(a) { 
 
    for (let i = a.length; i; i--) { 
 
     let j = Math.floor(Math.random() * i); 
 
     alert(i) 
 
     [a[i - 1], a[j]] = [a[j], a[i - 1]]; 
 
    } 
 
}

Linie 4 + 5 werden analysiert als:

 alert(i)[a[i - 1], a[j]] = [a[j], a[i - 1]];

bedeutet, dass der JS-Interpreter versucht, auf den Rückgabewert des Alerts als Array zuzugreifen (was offensichtlich nicht der Fall ist). Der Fehler verhindert, dass Ihre Schleife fortgesetzt wird, sodass Sie nur die erste Warnung erhalten.

Ich empfehle Ben Alman's blog post (satirical rant) für ein bisschen mehr auf Semikolons in JavaScript.

Verwandte Themen