Skip to content

Commit 0d1a2c1

Browse files
fortesjeresig
authored andcommitted
Make sure to do a deep copy on arrays. #5750
1 parent 6861b5d commit 0d1a2c1

File tree

2 files changed

+11
-6
lines changed

2 files changed

+11
-6
lines changed

src/core.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -316,10 +316,10 @@ jQuery.extend = jQuery.fn.extend = function() {
316316
continue;
317317
}
318318

319-
// Recurse if we're merging object literal values
320-
if ( deep && copy && jQuery.isPlainObject(copy) ) {
321-
// Don't extend not object literals
322-
var clone = src && jQuery.isPlainObject(src) ? src : {};
319+
// Recurse if we're merging object literal values or arrays
320+
if ( deep && copy && ( jQuery.isPlainObject(copy) || jQuery.isArray(copy) ) ) {
321+
var clone = src && ( jQuery.isPlainObject(src) || jQuery.isArray(src) ) ? src
322+
: jQuery.isArray(copy) ? [] : {};
323323

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

test/unit/core.js

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

645645
test("jQuery.extend(Object, Object)", function() {
646-
expect(25);
646+
expect(27);
647647

648648
var settings = { xnumber1: 5, xnumber2: 7, xstring1: "peter", xstring2: "pan" },
649649
options = { xnumber2: 1, xstring2: "x", xxx: "newstring" },
@@ -653,7 +653,9 @@ test("jQuery.extend(Object, Object)", function() {
653653
deep1copy = { foo: { bar: true } },
654654
deep2 = { foo: { baz: true }, foo2: document },
655655
deep2copy = { foo: { baz: true }, foo2: document },
656-
deepmerged = { foo: { bar: true, baz: true }, foo2: document };
656+
deepmerged = { foo: { bar: true, baz: true }, foo2: document },
657+
arr = [1, 2, 3],
658+
nestedarray = { arr: arr };
657659

658660
jQuery.extend(settings, options);
659661
same( settings, merged, "Check if extended: settings must be extended" );
@@ -668,6 +670,9 @@ test("jQuery.extend(Object, Object)", function() {
668670
same( deep2.foo, deep2copy.foo, "Check if not deep2: options must not be modified" );
669671
equals( deep1.foo2, document, "Make sure that a deep clone was not attempted on the document" );
670672

673+
ok( jQuery.extend(true, [], arr) !== arr, "Deep extend of array must clone array" );
674+
ok( jQuery.extend(true, {}, nestedarray).arr !== arr, "Deep extend of object must clone child array" );
675+
671676
var empty = {};
672677
var optionsWithLength = { foo: { length: -1 } };
673678
jQuery.extend(true, empty, optionsWithLength);

0 commit comments

Comments
 (0)