From 694b625c92c764621532dba20cbf943302b52d5a Mon Sep 17 00:00:00 2001
From: Robert Katic <robert.katic@gmail.com>
Date: Sat, 30 Jan 2010 19:50:49 +0100
Subject: [PATCH] Ensured that arrays are not considered same as plain object
 on deep extending. Fixes #5991.

---
 src/core.js       |   15 ++++++++++-----
 test/unit/core.js |    3 +--
 2 files changed, 11 insertions(+), 7 deletions(-)

diff --git a/src/core.js b/src/core.js
index b747e5b..23d40bd 100644
--- a/src/core.js
+++ b/src/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 );
diff --git a/test/unit/core.js b/test/unit/core.js
index eec3d7c..81bca10 100644
--- a/test/unit/core.js
+++ b/test/unit/core.js
@@ -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 = {};
-- 
1.7.10.4