]> source.dussan.org Git - jquery.git/commitdiff
Core: make isNumeric limited to strings and numbers 2663/head
authorTimmy Willison <timmywillisn@gmail.com>
Sun, 18 Oct 2015 19:50:43 +0000 (15:50 -0400)
committerTimmy Willison <timmywillisn@gmail.com>
Wed, 21 Oct 2015 20:22:22 +0000 (16:22 -0400)
Fixes gh-2662

src/core.js
test/unit/core.js

index a31e5f93f9fb2d33769a56c3bc8dfb2001d8ebd7..8e43547ac073490a69096e6d097218d172bdc9e7 100644 (file)
@@ -210,12 +210,12 @@ jQuery.extend( {
 
        isNumeric: function( obj ) {
 
-               // parseFloat NaNs numeric-cast false positives (null|true|false|"")
-               // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
-               // subtraction forces infinities to NaN
-               // adding 1 corrects loss of precision from parseFloat (#15100)
-               var realStringObj = obj && obj.toString();
-               return !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0;
+               // As of jQuery 3.0, isNumeric is limited to
+               // strings and numbers (primitives or objects)
+               // that can be coerced to finite numbers (gh-2662)
+               var type = jQuery.type( obj );
+               return ( type === "number" || type === "string" ) &&
+                       ( obj - parseFloat( obj ) + 1 ) >= 0;
        },
 
        isPlainObject: function( obj ) {
index 36504855dcdd28712567fe1151e1b875870400ef..dc644b504b933a0bd4823b7263451f07e7c73915 100644 (file)
@@ -474,8 +474,8 @@ QUnit.test( "isNumeric", function( assert ) {
        assert.ok( t( 1.5999999999999999 ), "Very precise floating point number" );
        assert.ok( t( 8e5 ), "Exponential notation" );
        assert.ok( t( "123e-2" ), "Exponential notation string" );
-       assert.ok( t( new ToString( "42" ) ), "Custom .toString returning number" );
 
+       assert.equal( t( new ToString( "42" ) ), false, "Custom .toString returning number" );
        assert.equal( t( "" ), false, "Empty string" );
        assert.equal( t( "        " ), false, "Whitespace characters string" );
        assert.equal( t( "\t\t" ), false, "Tab characters string" );