带有未定义值的javascript array.sort

时间:2011-01-24 14:37:05

标签: javascript sorting cross-browser

Array.prototype.sort如何处理数组中未定义的值?

var array = [1,undefined,2,undefined,3,undefined,4];
var array2 = [];
array2[0] = 1;array2[2] = 2;array2[4] = 3;array2[6] = 4;

致电array.sort(function(l,r) { ... });时,undefined永远不会传递lr

我可以保证所有未定义的值总是会到达所有浏览器的数组末尾吗?

以下循环是否会处理数组中的所有非undefined数据

array.sort();
for (var i = 0; array[i] !== undefined; i++) {
    // handle array
}

您可以假设没有人将undefined声明为变量。

4 个答案:

答案 0 :(得分:10)

是的,您可以放心地假设undefined将被移动到数组的末尾。

来自MDC

  

在JavaScript 1.2中,此方法不再将未定义的元素转换为null;相反,它将它们排序到数组的高端

来自spec, 15.4.4.11

  

因为不存在的属性值总是比未定义的属性值大,而且   undefined总是比任何其他值都要大,未定义的属性值总是排序到结果的末尾,   其次是不存在的属性值。

答案 1 :(得分:0)

看来未定义的值将落在列表的底部。这里有一些示例代码,向您展示会发生什么:

var a = [1,undefined,2,undefined,3,undefined,4];
  a = a.sort();
  for( i = 0 ; i < a.length ; i++ )
  {
    alert( a[i] );
  }

这当然是JavaScript的默认行为。如果您覆盖默认行为,那么只有您知道。

答案 2 :(得分:-1)

所有未定义的值都将转到数组的末尾,而不管它们在声明中的顺序如何。 (至少这是它在chrome的js引擎中的工作方式)

答案 3 :(得分:-4)

Safari只会在调用undefined方法

时删除sort();属性