From ceb5b4c9a30f47bcec2380f972ce09cfea532f8b Mon Sep 17 00:00:00 2001 From: Amey Sakhadeo Date: Wed, 28 Aug 2013 22:24:55 +0530 Subject: [PATCH] Ref #14313: Optimize 1.x jQuery.merge for size. (cherry picked from commits c75c9a8ebb5d2483daa68bec799e0d770083a811 f66d53c85643e703a8e37d9ca9375dd386a60cda) --- src/core.js | 18 +++++++------ test/unit/core.js | 64 ++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 62 insertions(+), 20 deletions(-) diff --git a/src/core.js b/src/core.js index d1e7a97e5..cc13f1ed3 100644 --- a/src/core.js +++ b/src/core.js @@ -629,15 +629,17 @@ jQuery.extend({ }, merge: function( first, second ) { - var l = second.length, - i = first.length, - j = 0; + var len = +second.length, + j = 0, + i = first.length; - if ( typeof l === "number" ) { - for ( ; j < l; j++ ) { - first[ i++ ] = second[ j ]; - } - } else { + while ( j < len ) { + first[ i++ ] = second[ j++ ]; + } + + // Support: IE<9 + // Workaround non-numeric length overrides of otherwise arraylike objects (e.g., NodeLists) + if ( len !== len ) { while ( second[j] !== undefined ) { first[ i++ ] = second[ j++ ]; } diff --git a/test/unit/core.js b/test/unit/core.js index 8817c95f9..e57d53334 100644 --- a/test/unit/core.js +++ b/test/unit/core.js @@ -905,25 +905,65 @@ test("jQuery.map", function() { }); test("jQuery.merge()", function() { - expect(8); + expect( 10 ); - deepEqual( jQuery.merge([],[]), [], "Empty arrays" ); + deepEqual( + jQuery.merge( [], [] ), + [], + "Empty arrays" + ); - deepEqual( jQuery.merge([ 1 ],[ 2 ]), [ 1, 2 ], "Basic" ); - deepEqual( jQuery.merge([ 1, 2 ], [ 3, 4 ]), [ 1, 2, 3, 4 ], "Basic" ); + deepEqual( + jQuery.merge( [ 1 ], [ 2 ] ), + [ 1, 2 ], + "Basic (single-element)" + ); + deepEqual( + jQuery.merge( [ 1, 2 ], [ 3, 4 ] ), + [ 1, 2, 3, 4 ], + "Basic (multiple-element)" + ); - deepEqual( jQuery.merge([ 1, 2 ],[]), [ 1, 2 ], "Second empty" ); - deepEqual( jQuery.merge([],[ 1, 2 ]), [ 1, 2 ], "First empty" ); + deepEqual( + jQuery.merge( [ 1, 2 ], [] ), + [ 1, 2 ], + "Second empty" + ); + deepEqual( + jQuery.merge( [], [ 1, 2 ] ), + [ 1, 2 ], + "First empty" + ); // Fixed at [5998], #3641 - deepEqual( jQuery.merge([ -2, -1 ], [ 0, 1, 2 ]), [ -2, -1 , 0, 1, 2 ], - "Second array including a zero (falsy)"); + deepEqual( + jQuery.merge( [ -2, -1 ], [ 0, 1, 2 ] ), + [ -2, -1 , 0, 1, 2 ], + "Second array including a zero (falsy)" + ); // After fixing #5527 - deepEqual( jQuery.merge([], [ null, undefined ]), [ null, undefined ], - "Second array including null and undefined values"); - deepEqual( jQuery.merge({ length: 0 }, [ 1, 2 ] ), { length: 2, 0: 1, 1: 2}, - "First array like"); + deepEqual( + jQuery.merge( [], [ null, undefined ] ), + [ null, undefined ], + "Second array including null and undefined values" + ); + deepEqual( + jQuery.merge( { length: 0 }, [ 1, 2 ] ), + { length: 2, 0: 1, 1: 2 }, + "First array like" + ); + deepEqual( + jQuery.merge( [ 1, 2 ], { length: 1, 0: 3 } ), + [ 1, 2, 3 ], + "Second array like" + ); + + deepEqual( + jQuery.merge( [], document.getElementById("lengthtest").getElementsByTagName("input") ), + [ document.getElementById("length"), document.getElementById("idTest") ], + "Second NodeList" + ); }); test("jQuery.extend(Object, Object)", function() { -- 2.39.5