Take the 2-minute tour ×
Stack Overflow is a question and answer site for professional and enthusiast programmers. It's 100% free, no registration required.

How does Array.prototype.sort handle undefined values in an array?

var array = [1,undefined,2,undefined,3,undefined,4];
var array2 = [];
array2[0] = 1;array2[2] = 2;array2[4] = 3;array2[6] = 4;

When calling array.sort(function(l,r) { ... }); The values undefined are never passed in as l or r.

Can I guarantee that all the undefined values will always go to the end of the array for all browsers?

Would the following loop handle all the non undefined data in an array

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

You may assume that no-one declared undefined as a variable.

share|improve this question
    
In IE <=8, they will be removed from the array entirely. See: github.com/documentcloud/underscore/issues/… –  Gijs Mar 23 '12 at 11:16

4 Answers 4

up vote 4 down vote accepted

Yes, you can safely assume undefined will get moved to the end of the array.

From MDC:

In JavaScript 1.2, this method no longer converts undefined elements to null; instead it sorts them to the high end of the array

From the spec, 15.4.4.11 :

Because non-existent property values always compare greater than undefined property values, and undefined always compares greater than any other value, undefined property values always sort to the end of the result, followed by non-existent property values.

share|improve this answer
    
Thank you. Its not neccesary for them to exist merely for there to be no "gaps" containing undefined values in the array. Please do add some kind of section or page number to the link for the spec. –  Raynos Jan 24 '11 at 14:46

all undefined values will go to the end of the array regardless of their order in declaration. (at least this is how it works in chrome's js engine)

share|improve this answer

It appears that the undefined values will fall to the bottom of the list. Here's some sample code to show you what happens:

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

This is, of course, the default behavior of JavaScript. If you overwrite the default behavior then only you will know.

share|improve this answer

Safari just deletes undefined property when calling sort(); method

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.