JavaScript数组的sort方法如何处理未定义的值?

23

Array.prototype.sort如何处理数组中的undefined值?

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声明为一个变量。


3
在IE <=8中,它们将被完全从数组中移除。请参见:https://github.com/documentcloud/underscore/issues/484#issuecomment-4055242 - Gijs
3个回答

25

是的,您可以安全地假设 undefined 会被移动到数组的末尾。

来自 MDC

  

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

来自 规范,15.4.4.11

  

因为不存在的属性值总是比未定义的属性值大,而 undefined 总是比任何其他值大,所以未定义的属性值始终会排序到结果的末尾,紧随其后的是不存在的属性值。


谢谢。它们存在并不是为了在数组中没有“间隙”包含未定义的值而存在。请在规范链接中添加某种部分或页码。 - Raynos

0

看起来未定义的值将会落到列表底部。以下是一些示例代码,展示了发生了什么:

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

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


0

所有未定义的值将会被放置在数组的末尾,无论它们在声明中的顺序如何。(至少在Chrome的JS引擎中是这样工作的)


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