【问题标题】:javascript array.sort with undefined valuesjavascript array.sort 具有未定义的值
【发布时间】:2011-06-14 13:42:22
【问题描述】:

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

【问题讨论】:

  • 在 IE github.com/documentcloud/underscore/issues/…

标签: javascript sorting cross-browser


【解决方案1】:

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

来自MDC

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

来自spec, 15.4.4.11

因为不存在的属性值总是比较大于未定义的属性值,并且 undefined 总是比较大于任何其他值, undefined 属性值总是排序到结果的末尾, 后跟不存在的属性值。

【讨论】:

  • 谢谢。它们不必仅仅因为数组中没有包含未定义值的“间隙”而存在。请在规范的链接中添加某种章节或页码。
【解决方案2】:

无论它们在声明中的顺序如何,所有未定义的值都将放在数组的末尾。 (至少在chrome的js引擎中是这样的)

【讨论】:

    【解决方案3】:

    似乎未定义的值将落在列表的底部。下面是一些示例代码,向您展示会发生什么:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-10
      • 1970-01-01
      • 2012-02-23
      • 2016-05-08
      • 2022-01-13
      • 2020-03-18
      • 1970-01-01
      相关资源
      最近更新 更多