]> source.dussan.org Git - jquery.git/commitdiff
Deprecated: Improve $.trim performance for strings with lots of whitespace
authorVladimir Sitnikov <sitnikov.vladimir@gmail.com>
Wed, 20 Jul 2022 08:51:13 +0000 (11:51 +0300)
committerGitHub <noreply@github.com>
Wed, 20 Jul 2022 08:51:13 +0000 (10:51 +0200)
Regex imp implementation takes `O(N^2)` time to trim the string when
multiple adjacent spaces were present.

The new expression require that the "whitespace run" starts from
a non-whitespace to avoid `O(N^2)` behavior when the engine would
try matching `\s+$` at each space position.

Closes gh-5068

src/deprecated.js

index cc13c3c825dd91d1430fa757e0c27ab99342b7b1..ca54982d7d6b5df600fb4b9d8057ea9fdbe4a929 100644 (file)
@@ -15,7 +15,9 @@ define( [
 
 // Support: Android <=4.0 only
 // Make sure we trim BOM and NBSP
-var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
+// Require that the "whitespace run" starts from a non-whitespace
+// to avoid O(N^2) behavior when the engine would try matching "\s+$" at each space position.
+var rtrim = /^[\s\uFEFF\xA0]+|([^\s\uFEFF\xA0])[\s\uFEFF\xA0]+$/g;
 
 // Bind a function to a context, optionally partially applying any
 // arguments.
@@ -82,6 +84,6 @@ jQuery.isNumeric = function( obj ) {
 jQuery.trim = function( text ) {
        return text == null ?
                "" :
-               ( text + "" ).replace( rtrim, "" );
+               ( text + "" ).replace( rtrim, "$1" );
 };
 } );