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
永远不会作为 l
或 r
传入。
我可以保证所有浏览器中所有未定义的值都将始终到达数组的末尾吗?
以下循环是否可以处理数组中所有非
undefined
数据
array.sort();
for (var i = 0; array[i] !== undefined; i++) {
// handle array
}
您可能会假设没有人将
undefined
声明为变量。
是的,您可以放心地假设
undefined
将移至数组的末尾。
来自MDC:
在 JavaScript 1.2 中,该方法不再将未定义的元素转换为 null;相反,它将它们排序到数组的高端
来自 规范,15.4.4.11 :
因为不存在的属性值总是比未定义的属性值大,并且 undefined 总是比较大于任何其他值,未定义的属性值总是排序到结果的末尾, 接下来是不存在的属性值。
所有未定义的值都将转到数组的末尾,无论它们在声明中的顺序如何。 (至少在chrome的js引擎中是这样的)
看起来未定义的值将落到列表的底部。下面是一些示例代码,向您展示会发生什么:
var a = [1, undefined, 2, undefined, 3, undefined, 4];
a.sort();
for (i = 0; i < a.length; i++) {
console.log(a[i]);
}
这当然是 JavaScript 的默认行为。如果您覆盖默认行为,那么只有您知道。