javascript array.sort с неопределенными значениями - PullRequest
12 голосов
/ 24 января 2011

Как 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 в качестве переменной.

Ответы [ 4 ]

10 голосов
/ 24 января 2011

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

С MDC :

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

Из спецификации , 15.4.4.11 :

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

0 голосов
/ 27 июня 2012

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

0 голосов
/ 24 января 2011

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

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

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

0 голосов
/ 24 января 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...