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!
das ist ein bisschen hart, wenn man bedenkt, es gibt einfache Methoden, um zu überprüfen, dass – Dani
oh, es gibt überall Programmierung fehlschlägt. manchmal mögen Leute wirklich die schlechte Art, Dinge zu tun :) –
@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. –