Ensured that arrays are not considered same as plain object on deep extending. Fixes...
authorRobert Katic <robert.katic@gmail.com>
Sat, 30 Jan 2010 18:50:49 +0000 (19:50 +0100)
committerjeresig <jeresig@gmail.com>
Thu, 23 Sep 2010 16:07:06 +0000 (12:07 -0400)
src/core.js
test/unit/core.js

index b747e5b..23d40bd 100644 (file)
@@ -306,7 +306,7 @@ jQuery.fn.init.prototype = jQuery.fn;
 
 jQuery.extend = jQuery.fn.extend = function() {
        // copy reference to target object
-       var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options, name, src, copy;
+       var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options, name, src, copy, copyIsArray;
 
        // Handle a deep copy situation
        if ( typeof target === "boolean" ) {
@@ -340,10 +340,15 @@ jQuery.extend = jQuery.fn.extend = function() {
                                        continue;
                                }
 
-                               // Recurse if we're merging object literal values or arrays
-                               if ( deep && copy && ( jQuery.isPlainObject(copy) || jQuery.isArray(copy) ) ) {
-                                       var clone = src && ( jQuery.isPlainObject(src) || jQuery.isArray(src) ) ? src
-                                               : jQuery.isArray(copy) ? [] : {};
+                               // Recurse if we're merging plain objects or arrays
+                               if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
+                                       if ( copyIsArray ) {
+                                               copyIsArray = false;
+                                               clone = src && jQuery.isArray(src) ? src : [];
+
+                                       } else {
+                                               clone = src && jQuery.isPlainObject(src) ? src : {};
+                                       }
 
                                        // Never move original objects, clone them
                                        target[ name ] = jQuery.extend( deep, clone, copy );
index eec3d7c..81bca10 100644 (file)
@@ -661,7 +661,7 @@ test("jQuery.merge()", function() {
 });
 
 test("jQuery.extend(Object, Object)", function() {
-       expect(27);
+       expect(26);
 
        var settings = { xnumber1: 5, xnumber2: 7, xstring1: "peter", xstring2: "pan" },
                options = { xnumber2: 1, xstring2: "x", xxx: "newstring" },
@@ -688,7 +688,6 @@ test("jQuery.extend(Object, Object)", function() {
        same( deep2.foo, deep2copy.foo, "Check if not deep2: options must not be modified" );
        equals( deep1.foo2, document, "Make sure that a deep clone was not attempted on the document" );
 
-       ok( jQuery.extend(true, [], arr) !== arr, "Deep extend of array must clone array" );
        ok( jQuery.extend(true, {}, nestedarray).arr !== arr, "Deep extend of object must clone child array" );
 
        var empty = {};