Javascript array.sort с undefined значениями

Как 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 никогда не передаются как l или r.

Могу ли я гарантировать, что все значения undefined всегда будут идти до конца массива для всех браузеров?

Будет ли следующий цикл обрабатывать все данные не undefined в массиве

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

Вы можете предположить, что никто не объявлял undefined в качестве переменной.

Ответ 1

Да, вы можете смело предположить, что undefined будет перемещен в конец массива.

От MDC:

В JavaScript 1.2 этот метод больше не преобразует элементы undefined в null; вместо этого он сортирует их к верхнему концу массива

Из spec, 15.4.4.11:

Поскольку значения несуществующих свойств всегда сравниваются с значениями свойств undefined и undefined всегда сравнивается больше любого другого значения, значения свойств undefined всегда сортируются до конца результата, за которыми следуют несуществующие значения свойств.

Ответ 2

Похоже, что значения undefined попадут в нижнюю часть списка. Вот несколько примеров кода, чтобы показать вам, что происходит:

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

Это, конечно же, поведение JavaScript по умолчанию. Если вы перезапишите поведение по умолчанию, тогда вы узнаете только.

Ответ 3

все значения undefined будут идти до конца массива независимо от их порядка в объявлении. (по крайней мере, так оно работает в процессоре chrome js)

Ответ 4

Safari просто удаляет свойство undefined при вызове метода sort();