这个(无用的?)javascript代码有什么作用?

时间:2010-08-10 03:02:27

标签: javascript jquery

在调试使用jQuery的javascript代码时,我发现了以下代码:

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

通过我对javascript的理解,这段代码将对包含两个零的数组进行排序,并使用比较函数,该函数将始终设置一个全局变量并返回相等,这与baseHasDuplicate = false;具有相同的效果。 来自一个有价值的来源,我想我错过了一些东西。 我错过了什么或这是一个编程失败了吗?

1 个答案:

答案 0 :(得分:12)

正如您所见here(中文),此代码可能用于测试Chrome。 编辑:请参阅下面的完整故事 ..

正如文章中所解释的那样,Chrome会优化“.sort(...)”方法,使[0, 0].sort(...)调用不会执行给定的比较函数。

从文章中,Chrome的“.sort(...)”实现类似于:

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

如果0 === 0为真,则不会调用comparefn

对于jQuery,它不会将全局变量baseHasDuplicate设置为false


编辑:如果您浏览Sizzle的源代码,例如here(转到“Sizzle CSS Selector Engine”下的黄色部分,称为“Sizzle变量”),您会发现以下解释:

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

看起来神秘莫测!