]> source.dussan.org Git - jquery.git/commitdiff
Core: Tiny efficiency fix to jQuery.extend / jQuery.fn.extend (#4246)
authorMarja Hölttä <marja.holtta@gmail.com>
Wed, 12 Dec 2018 16:13:18 +0000 (17:13 +0100)
committerMichał Gołębiowski-Owczarek <m.goleb@gmail.com>
Wed, 12 Dec 2018 16:13:18 +0000 (17:13 +0100)
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

index 633d09381b7172ab7b42372e31b1c085e87532a7..84f9afe13bbed6beef12dd47981dc88a7e620fde 100644 (file)
@@ -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 );