Rewrote .merge() (faster and less obtuse now). Fixed #5610.
authorJohn Resig <jeresig@gmail.com>
Thu, 10 Dec 2009 05:43:20 +0000 (21:43 -0800)
committerJohn Resig <jeresig@gmail.com>
Thu, 10 Dec 2009 05:43:20 +0000 (21:43 -0800)
src/core.js
test/unit/core.js

index 5f1bc3a..4c7b07e 100644 (file)
@@ -567,23 +567,20 @@ jQuery.extend({
        },
 
        merge: function( first, second ) {
-               var pos, i = second.length;
+               var i = first.length, j = 0;
 
-               // We have to get length this way when IE & Opera overwrite the length
-               // expando of getElementsByTagName
-               if ( i && i.nodeType ) {
-                       for ( i = 0; second[i]; ++i ) {}
-               }
-               
-               pos = i + first.length;
-               
-               // Correct length for non Arrays
-               first.length = pos;
-               
-               while ( i ) {
-                       first[ --pos ] = second[ --i ];
+               if ( typeof second.length === "number" ) {
+                       for ( var l = second.length; j < l; j++ ) {
+                               first[ i++ ] = second[ j ];
+                       }
+               } else {
+                       while ( second[j] !== undefined ) {
+                               first[ i++ ] = second[ j++ ];
+                       }
                }
 
+               first.length = i;
+
                return first;
        },
 
index 252c9f9..576deb7 100644 (file)
@@ -711,7 +711,7 @@ test("jQuery.each(Object,Function)", function() {
 });
 
 test("jQuery.makeArray", function(){
-       expect(15);
+       expect(17);
 
        equals( jQuery.makeArray(jQuery('html>*'))[0].nodeName.toUpperCase(), "HEAD", "Pass makeArray a jQuery object" );
 
@@ -744,6 +744,10 @@ test("jQuery.makeArray", function(){
        equals( jQuery.makeArray(/a/)[0].constructor, RegExp, "Pass makeArray a regex" );
 
        ok( jQuery.makeArray(document.getElementById('form')).length >= 13, "Pass makeArray a form (treat as elements)" );
+
+       // For #5610
+       same( jQuery.makeArray({'length': '0'}), [], "Make sure object is coerced properly.");
+       same( jQuery.makeArray({'length': '5'}), [], "Make sure object is coerced properly.");
 });
 
 test("jQuery.isEmptyObject", function(){