From 4ffb1df8e4738eb86bde429ec20efc7394e5e497 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marja=20H=C3=B6ltt=C3=A4?= Date: Wed, 12 Dec 2018 17:13:18 +0100 Subject: [PATCH] Core: Tiny efficiency fix to jQuery.extend / jQuery.fn.extend (#4246) Read target[name] only when it's needed. In addition to doing the property read-only when needed, this avoids a slow path in V8 (see the issue for more details). Fixes gh-4245 Closes gh-4246 --- src/core.js | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/core.js b/src/core.js index 633d09381..84f9afe13 100644 --- a/src/core.js +++ b/src/core.js @@ -156,7 +156,6 @@ jQuery.extend = jQuery.fn.extend = function() { // Extend the base object for ( name in options ) { - src = target[ name ]; copy = options[ name ]; // Prevent never-ending loop @@ -167,14 +166,17 @@ jQuery.extend = jQuery.fn.extend = function() { // Recurse if we're merging plain objects or arrays if ( deep && copy && ( jQuery.isPlainObject( copy ) || ( copyIsArray = Array.isArray( copy ) ) ) ) { + src = target[ name ]; - if ( copyIsArray ) { - copyIsArray = false; - clone = src && Array.isArray( src ) ? src : []; - + // Ensure proper type for the source value + if ( copyIsArray && !Array.isArray( src ) ) { + clone = []; + } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { + clone = {}; } else { - clone = src && jQuery.isPlainObject( src ) ? src : {}; + clone = src; } + copyIsArray = false; // Never move original objects, clone them target[ name ] = jQuery.extend( deep, clone, copy ); -- 2.39.5