Chrome V8 引擎对 sort 的优化
var a = 0, b = 0;
[0, 0].sort(function() {
a = 1;
return 0;
});
[0, 1].sort(function() {
b = 1;
return 0;
});
alert(a === b); // true or false ?
上面的代码,除了 Chrome 输出 false, 其它浏览器皆为 true.
原因是 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);
}
...
}
虽然是优化,但也是陷阱。想用 sort 来干点额外体力活时,一定要小心。

February 3rd, 2010 on 13:02
咦,你是怎么发现下面后一段优化后的代码啊?相当怀疑……这明显是不能够这样的,除了你说的问题之外还有,既然提供了自定义的comparer,谁说a === b的时候,我的comparer就一定返回0啊……
February 3rd, 2010 on 13:17
你是从哪些发现这个的?
February 3rd, 2010 on 14:51
请问下chrome的代码从哪里可以看到?
还有这个例子的原因是comparefn.call(null, x, y);把上下文变为null的原因吧?
对js不熟悉,望指点,别笑哈:)
February 4th, 2010 on 8:26
@all: 在 Chrome3 中输入
javascript: alert(Array.prototype.sort)就可以看到源码。注意:Chrome 从 4.0 开始把这个特性取消了,只能从源码中去找。February 4th, 2010 on 10:19
在v8的源代码的src目录下的array.js
February 4th, 2010 on 10:57
好博 我想问一下 做前端开发 需要什么条件 很感兴趣
以后想从事这方面
我自己只懂xhtml div+css js jquery
February 9th, 2010 on 12:45
越来越高深了,越来越看不懂了~~~~
February 12th, 2010 on 16:27
v8的源码是公开的……
March 5th, 2010 on 12:42
不太明白程序源码!
leave a reply