2010-08-10 19 views
7

Während ein JavaScript-Code debuggen, die jQuery verwendet habe ich den folgenden Code:Was macht dieser (nutzlose?) JavaScript-Code?

[0, 0].sort(function() 
{ 
    baseHasDuplicate = false; 
    return 0; 
}); 

Durch mein Verständnis von JavaScript, um diese Code-Array mit zwei Nullen mit Vergleichsfunktion sortiert werden, die immer eine globale Variable gesetzt werden und Gleichheit zurückkehren , die die gleiche Wirkung wie baseHasDuplicate = false; hat.
Ich komme aus einer geschätzten Quelle, ich glaube, ich habe etwas verpasst. Habe ich etwas vermisst oder ist dies ein Programmfehler?

Antwort

12

Wie Sie sehen können here (Chinesisch), könnte dieser Code zum Testen für Chrome verwendet werden. EDIT: siehe unten für die komplette Geschichte ..

Wie in dem Artikel erklärt, was passiert ist, dass Chrome das „.Sort (...)“ Verfahren so optimiert, dass der [0, 0].sort(...) Anruf wird nicht Führe die angegebene Vergleichsfunktion aus.

Aus dem Artikel, Chrome Umsetzung von ".Sort (...)" ist so etwas wie:

function sort(comparefn) { 
    var custom_compare = (typeof(comparefn) === 'function'); 
    function Compare(x,y) { 
    if (x === y) return 0; 
    if (custom_compare) { 
     return comparefn.call(null, x, y); 
    } 
    ... 
} 

Als 0 === 0 wahr ist, wird es nicht comparefn nennen. Im Fall von jQuery wird die globale Variable baseHasDuplicate nicht auf false gesetzt.


EDIT: Wenn Sie Sizzle Quellcode durchsuchen, here zum Beispiel (gehen Sie zu dem gelben Abschnitt unter "Sizzle CSS-Selektor-Engine", "Sizzle Variablen" genannt), werden Sie die folgende Erklärung finden:

var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, 
     done = 0, 
     toString = Object.prototype.toString, 
     hasDuplicate = false, 
     baseHasDuplicate = true; 

// Here we check if the JavaScript engine is using some sort of 
// optimization where it does not always call our comparision 
// function. If that is the case, discard the hasDuplicate value. 
// Thus far that includes Google Chrome. 
[0, 0].sort(function(){ 
     baseHasDuplicate = false; 
     return 0; 
});  

Sieht entmystifiziert aus!

+2

das ist ein bisschen hart, wenn man bedenkt, es gibt einfache Methoden, um zu überprüfen, dass – Dani

+1

oh, es gibt überall Programmierung fehlschlägt. manchmal mögen Leute wirklich die schlechte Art, Dinge zu tun :) –

+0

@Dani: tatsächlich! Allerdings könnte der Code für etwas anderes verwendet werden ... Es wäre großartig, von "dem Javascript Ninja" zu hören. –