Skip to content
Permalink
Browse files

Ensured that arrays are not considered same as plain object on deep e…

…xtending. Fixes #5991.
  • Loading branch information
rkatic authored and jeresig committed Jan 30, 2010
1 parent 2f60335 commit 694b625c92c764621532dba20cbf943302b52d5a
Showing with 11 additions and 7 deletions.
  1. +10 −5 src/core.js
  2. +1 −2 test/unit/core.js
@@ -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 );
@@ -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 = {};

0 comments on commit 694b625

Please sign in to comment.
You can’t perform that action at this time.