在调试使用jQuery的javascript代码时,我发现了以下代码:
[0, 0].sort(function()
{
baseHasDuplicate = false;
return 0;
});
通过我对javascript的理解,这段代码将对包含两个零的数组进行排序,并使用比较函数,该函数将始终设置一个全局变量并返回相等,这与baseHasDuplicate = false;
具有相同的效果。
来自一个有价值的来源,我想我错过了一些东西。
我错过了什么或这是一个编程失败了吗?
答案 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;
});
看起来神秘莫测!