Skip to content

Commit

Permalink
Ensured that arrays are not considered same as plain object on deep e…
Browse files Browse the repository at this point in the history
…xtending. Fixes #5991.
  • Loading branch information
rkatic authored and jeresig committed Sep 23, 2010
1 parent 2f60335 commit 694b625
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 7 deletions.
15 changes: 10 additions & 5 deletions src/core.js
Expand Up @@ -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" ) {
Expand Down Expand Up @@ -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 );
Expand Down
3 changes: 1 addition & 2 deletions test/unit/core.js
Expand Up @@ -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" },
Expand All @@ -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 = {};
Expand Down

0 comments on commit 694b625

Please sign in to comment.