Skip to content

Commit ba8c934

Browse files
committed
Ensured that arrays are not considered same as plain object on deep extending. Fixes #5991.
1 parent 26d836b commit ba8c934

File tree

2 files changed

+10
-8
lines changed

2 files changed

+10
-8
lines changed

src/core.js

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -292,7 +292,7 @@ jQuery.fn.init.prototype = jQuery.fn;
292292

293293
jQuery.extend = jQuery.fn.extend = function() {
294294
// copy reference to target object
295-
var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options, name, src, copy;
295+
var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options, name, src, copy, copyIsArray;
296296

297297
// Handle a deep copy situation
298298
if ( typeof target === "boolean" ) {
@@ -326,10 +326,13 @@ jQuery.extend = jQuery.fn.extend = function() {
326326
continue;
327327
}
328328

329-
// Recurse if we're merging object literal values or arrays
330-
if ( deep && copy && ( jQuery.isPlainObject(copy) || jQuery.isArray(copy) ) ) {
331-
var clone = src && ( jQuery.isPlainObject(src) || jQuery.isArray(src) ) ? src
332-
: jQuery.isArray(copy) ? [] : {};
329+
// Recurse if we're merging plain objects or arrays
330+
if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
331+
if ( copyIsArray ) {
332+
clone = src && jQuery.isArray(src) ? src : [];
333+
} else {
334+
clone = src && jQuery.isPlainObject(src) ? src : {};
335+
}
333336

334337
// Never move original objects, clone them
335338
target[ name ] = jQuery.extend( deep, clone, copy );

test/unit/core.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -599,7 +599,7 @@ test("jQuery.merge()", function() {
599599
});
600600

601601
test("jQuery.extend(Object, Object)", function() {
602-
expect(27);
602+
expect(26);
603603

604604
var settings = { xnumber1: 5, xnumber2: 7, xstring1: "peter", xstring2: "pan" },
605605
options = { xnumber2: 1, xstring2: "x", xxx: "newstring" },
@@ -626,7 +626,6 @@ test("jQuery.extend(Object, Object)", function() {
626626
same( deep2.foo, deep2copy.foo, "Check if not deep2: options must not be modified" );
627627
equals( deep1.foo2, document, "Make sure that a deep clone was not attempted on the document" );
628628

629-
ok( jQuery.extend(true, [], arr) !== arr, "Deep extend of array must clone array" );
630629
ok( jQuery.extend(true, {}, nestedarray).arr !== arr, "Deep extend of object must clone child array" );
631630

632631
var empty = {};
@@ -829,4 +828,4 @@ test("jQuery.parseJSON", function(){
829828
} catch( e ) {
830829
ok( true, "Test malformed JSON string." );
831830
}
832-
});
831+
});

0 commit comments

Comments
 (0)