这段(无用?)的JavaScript代码是做什么的?

7

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

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

据我对JavaScript的理解,这段代码将使用比较函数对包含两个零的数组进行排序,该比较函数将始终设置一个全局变量并返回相等,这与 baseHasDuplicate = false; 具有相同的效果。
从一位可靠的消息来源得知,我认为我可能错过了什么。 我是错过了还是程序出了问题?
1个回答

12

正如你可以在这里(中文)看到的那样,这段代码可能用于测试 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的源代码,例如这里(转到"Sizzle CSS Selector Engine"下面的黄色部分,称为"Sizzle variables"),您将找到以下说明:
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;
});     

看起来已经很简单易懂了!


2
考虑到有简单的方法可以检查,这有点严厉。 - Daniel
2
哦,编程失败无处不在。有时候人们确实喜欢用错误的方式做事 :) - Jimmie Lin
@Dani:好的,那是另一个问题!它将被用于检查浏览器是否按照Sizzle所需的方式调用排序函数(在“Sizzle.uniqueSort(...)”中)。 - Bruno Reis
1
@Dani - 哦,糟糕。我现在理解代码了,我之前想反了。如果函数没有被优化掉,baseHasDuplicate 就是 false,允许自定义比较函数来确定是否有重复项。如果它已经被优化掉,这将确保 hasDuplicate 总是为 true,这意味着遍历数组以删除重复项将始终发生(实际上是 Chrome 对 sort() 优化的反优化)。 - Tim Stone
@Dani - 好的,这是在他们选择如何做事的情况下,但你肯定是对的,如果总体方法浪费,那么这基本上是无关紧要的。你必须问代码的作者为什么选择以这种方式进行操作,因为我没有看到任何明显的理由,说明他们不能编写自定义排序器来同时删除重复项。 - Tim Stone
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接