Überprüfen Sie, ob die Variable in JavaScript eine Zahl oder eine Zeichenfolge ist


Antworten:


442

Wenn Sie mit Literalnotation und nicht mit Konstruktoren arbeiten, können Sie typeof : verwenden.

typeof "Hello World"; // string
typeof 123;           // number

Wenn Sie Zahlen und Strings über einen Konstruktor erstellen, wie zum Beispiel var foo = new String("foo"), sollten Sie bedenken , dass typeofzurückkehren objectzu foo.

Eine narrensichere Methode zur Überprüfung des Typs wäre möglicherweise die Verwendung der Methode in underscore.js (kommentierte Quelle finden Sie hier ).

var toString = Object.prototype.toString;

_.isString = function (obj) {
  return toString.call(obj) == '[object String]';
}

Dies gibt einen Booleschen Wert truefür Folgendes zurück:

_.isString("Jonathan"); // true
_.isString(new String("Jonathan")); // true

69
die sagt "Zeichenfolge" und "Nummer"
Thilo

27
Das ist nicht richtig! Es gibt zwei mögliche Darstellungen einer Zeichenfolge. alert (typeof new String ()) gibt "Object" aus. Schlimmer noch, Javascript konvertiert gelegentlich zwischen den beiden Darstellungen hinter den Kulissen zu Optimierungszwecken hin und her
George Mauer

3
@George Laut OP werden nur vorhandene Variablen getestet.
Sampson

3
Sicher, aber sagen wir, ich habe die Funktion isString (str) {return typeof str === 'string'} Einige Java-Konverter können meine Methode wie folgt verwenden, sodass var myString = new String("stuff I like"); isString(myString)dies false zurückgibt. Außerdem bin ich mir nicht ganz sicher, wie lange die Hintergrundkonvertierung dauert. Ich weiß, wenn ich "hi" .length aufrufe, wird "hi" in ein Objekt konvertiert, nicht sicher, wie schnell es wieder konvertiert wird oder ob dies jemals gebunden ist zur Variablen.
George Mauer

8
Stimmt, aber wth möchten Sie das String-Objekt trotzdem verwenden?
Félix Saparelli

211

Der beste Weg, dies zu tun, ist das isNaNCasting vom Typ +:

All-in-Methode aktualisiert:

function isNumber(n) { return !isNaN(parseFloat(n)) && !isNaN(n - 0) }

Das gleiche mit Regex:

function isNumber(n) { return /^-?[\d.]+(?:e-?\d+)?$/.test(n); } 

------------------------

isNumber('123'); // true  
isNumber('123abc'); // false  
isNumber(5); // true  
isNumber('q345'); // false
isNumber(null); // false
isNumber(undefined); // false
isNumber(false); // false
isNumber('   '); // false

21
Dies scheint eine gute Lösung zu sein, wenn Sie Zeichenfolgen zählen möchten, die als gültige Zahlen analysiert werden.
Trevor Burnham

2
Zu Ihrer Information: nullwird auf 0 gezwungen und gibt true fürisNumber(null);
Edward

1
Was ist los mitfunction is_number(n) { return /^-?[\d.]+(?:e-?\d+)?$/.test(n);}
OneOfOne

1
Dies schlägt auch für eine Zeichenfolge wie '123abc' fehl.
Asche

1
@ash Danke, ich habe die Lösung aktualisiert, um auch diesen Fall abzudecken.
BitOfUniverse

73

Der beste Weg, den ich gefunden habe, besteht darin, entweder nach einer Methode für die Zeichenfolge zu suchen, dh:

if (x.substring) {
// do string thing
} else{
// do other thing
}

oder wenn Sie etwas mit der Nummernprüfung für eine Zahleneigenschaft tun möchten,

if (x.toFixed) {
// do number thing
} else {
// do other thing
}

Dies ist eine Art "Ententippen". Es liegt an Ihnen, welcher Weg am sinnvollsten ist. Ich habe nicht genug Karma, um Kommentare abzugeben, aber typeof schlägt für Zeichenfolgen und Zahlen in Kästchen fehl, dh:

alert(typeof new String('Hello World'));
alert(typeof new Number(5));

wird "Objekt" alarmieren.


2
Ich finde das besser, als typeofes immer auf einen String testen kann, ob primitiv oder String-Objekt. Sie müssen nur nach einer Methode suchen, die für den gewünschten Typ eindeutig ist.
ADTC

Aus der Sicht von jemandem, der Code pflegen muss, kann die Auswahl dieses Pfades verwirrend sein. "Warum haben sie Teilzeichenfolgen verwendet und keine Werte übergeben? Welche Geschäftslogik fehlt mir hier?" Zumindest muss dies mit einem Kommentar gepaart werden, der die Logik erklärt.
Lemmings19

3
@ Lemmings19 Die Teilstring-Methode wird nicht aufgerufen, sondern nur geprüft, ob x eine Teilstring-Methode hat.
Alokito

1
Ich mag die Idee dieser Art von Ententypisierung, aber dies wird für Dinge wie scheitern {substring:"hello"}. Ich weiß für meine Zwecke, dass ich gerade getestet habe, was die spezifische Operation, die ich ausführen musste (Modul), für den Typ bewirkt, nach dem ich suchen musste (bei Zeichenfolgen gibt der Modul undefiniert zurück), und dann darauf überprüft habe, anstatt den Typ zu erhalten.
Tadhg McDonald-Jensen

30

Sie suchen isNaN():

console.log(!isNaN(123));
console.log(!isNaN(-1.23));
console.log(!isNaN(5-2));
console.log(!isNaN(0));
console.log(!isNaN("0"));
console.log(!isNaN("2"));
console.log(!isNaN("Hello"));
console.log(!isNaN("2005/12/12"));

Siehe JavaScript isNaN () -Funktion bei MDN.


3
Ich finde es seltsam, dass sie die inverse Operation für den Methodennamen wählen würden. Es scheint intuitiver zu sein, isNumber () aufzurufen.
Nathan Taylor

12
Es ist eigentlich keine inverse Operation von 'isNumber'. NaN ist ein spezieller Zahlenwert in Javascript. isNaN konvertiert alles, was ihm geliefert wird, in eine Zahl und prüft, ob das Ergebnis NaN ist oder nicht. Für Zeichenfolgen wie "25" erhalten Sie ein falsches Ergebnis.
Chetan Sastry

1
Ich habe gerade mit "25" getestet und es wurde falsch zurückgegeben - wie ich es erwarten würde.
Jakob Gade

2
NaN ist ein spezieller Wert im IEEE 754-Standard für binäre Gleitkomma-Arithmetik, nicht nur eine JavaScript-Sache. ( Um genau zu sein: "Die 9007199254740990 (dh (2 ^ 53) -2) unterschiedlichen" Not-a-Number "-Werte des IEEE-Standards werden in ECMAScript als ein einziger spezieller NaN-Wert dargestellt." )
NickFitz

2
Beachten Sie, dass isNaNRenditen falsefür null(aber truefür undefined).
Toni

28

Überprüfen Sie, ob der Wert ein String-Literal oder ein String-Objekt ist:

function isString(o) {
    return typeof o == "string" || (typeof o == "object" && o.constructor === String);
}

Gerätetest:

function assertTrue(value, message) {
    if (!value) {
        alert("Assertion error: " + message);
    }
}

function assertFalse(value, message)
{
    assertTrue(!value, message);
}

assertTrue(isString("string literal"), "number literal");
assertTrue(isString(new String("String object")), "String object");
assertFalse(isString(1), "number literal");
assertFalse(isString(true), "boolean literal");
assertFalse(isString({}), "object");

Das Suchen nach einer Nummer ist ähnlich:

function isNumber(o) {
    return typeof o == "number" || (typeof o == "object" && o.constructor === Number);
}

1
(o.constructor === String) allein scheint selbst für String-Literale ausreichend zu sein.
Chris Noe

2
Dies führt zu einer Ausnahme, wenn o === null
TJ.

3
Ich habe diese Lösung geliebt. Um die Ausnahme für den Nullfall zu vermeiden, verwenden Sie o ["Konstruktor"] anstelle von o.constructor
dreamerkumar

2
@ VishalKumar Das ist also alles was man braucht : function is (type, value) { return value["constructor"] === type; }?
Ceving

22

Seit ES2015 ist der richtige Weg zu prüfen, ob eine Variable eine gültige Nummer enthält Number.isFinite(value)

Beispiele:

Number.isFinite(Infinity)   // false
Number.isFinite(NaN)        // false
Number.isFinite(-Infinity)  // false

Number.isFinite(0)          // true
Number.isFinite(2e64)       // true

Number.isFinite('0')        // false
Number.isFinite(null)       // false

1
Dies wird im Internet Explorer nicht unterstützt. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Davedeecoder

1
Funktioniert nicht mit String, was die ursprüngliche Frage ist.
Eric Grange

18

Versuche dies,

<script>
var regInteger = /^-?\d+$/;

function isInteger( str ) {    
    return regInteger.test( str );
}

if(isInteger("1a11")) {
   console.log( 'Integer' );
} else {
   console.log( 'Non Integer' );
}
</script>

versuche '-2'. es gibt false zurück.
KChen

1
Warum behalten Sie eine Antwort bei (oder bearbeiten sie nicht), die nicht funktioniert? ... Beachten Sie, dass auch eine negative Zahl eine Ganzzahl sein kann.
Ason

13

Der beste Weg, dies zu tun:

function isNumber(num) {
  return (typeof num == 'string' || typeof num == 'number') && !isNaN(num - 0) && num !== '';
};

Dies erfüllt die folgenden Testfälle:

assertEquals("ISNUMBER-True: 0", true, isNumber(0));
assertEquals("ISNUMBER-True: 1", true, isNumber(-1));
assertEquals("ISNUMBER-True: 2", true, isNumber(-500));
assertEquals("ISNUMBER-True: 3", true, isNumber(15000));
assertEquals("ISNUMBER-True: 4", true, isNumber(0.35));
assertEquals("ISNUMBER-True: 5", true, isNumber(-10.35));
assertEquals("ISNUMBER-True: 6", true, isNumber(2.534e25));
assertEquals("ISNUMBER-True: 7", true, isNumber('2.534e25'));
assertEquals("ISNUMBER-True: 8", true, isNumber('52334'));
assertEquals("ISNUMBER-True: 9", true, isNumber('-234'));

assertEquals("ISNUMBER-False: 0", false, isNumber(NaN));
assertEquals("ISNUMBER-False: 1", false, isNumber({}));
assertEquals("ISNUMBER-False: 2", false, isNumber([]));
assertEquals("ISNUMBER-False: 3", false, isNumber(''));
assertEquals("ISNUMBER-False: 4", false, isNumber('one'));
assertEquals("ISNUMBER-False: 5", false, isNumber(true));
assertEquals("ISNUMBER-False: 6", false, isNumber(false));
assertEquals("ISNUMBER-False: 7", false, isNumber());
assertEquals("ISNUMBER-False: 8", false, isNumber(undefined));
assertEquals("ISNUMBER-False: 9", false, isNumber(null));

13
//testing data types accurately in JavaScript (opposed to "typeof")
//from http://bonsaiden.github.com/JavaScript-Garden/
function is(type, obj) {
    var clas = Object.prototype.toString.call(obj).slice(8, -1);
    return obj !== undefined && obj !== null && clas === type;
}

//basic usage
is('String', 'test'); // true
is('Array', true); // false

Oder passen Sie es an, um einen unbekannten Typ zurückzugeben:

function realTypeOf(obj) {
    return Object.prototype.toString.call(obj).slice(8, -1);
}

//usage
realTypeOf(999); // 'Number'

12. Mai 2012 Update: Vollständiges Beispiel bei Javascript: Ein besserer Typ .


Noch Verbesserungspotenzial in Bezug auf realTypeOf: realTypeOf(NaN) -> "Number"das gleiche Verhalten wie typeofvereinbart, aber immer noch alles andere als ideal.
Max

9

Hier ist ein Ansatz, der auf der Idee basiert, die Eingabe in eine Zahl oder Zeichenfolge zu zwingen, indem Null oder die Nullzeichenfolge hinzugefügt werden, und dann einen typisierten Gleichheitsvergleich durchzuführen.

function is_number(x) { return x === x+0;  }
function is_string(x) { return x === x+""; }

Aus irgendeinem unergründlichen Grund x===x+0scheint es besser zu funktionieren als x===+x.

Gibt es Fälle, in denen dies fehlschlägt?

In der gleichen Richtung:

function is_boolean(x) { return x === !!x; }

Dies scheint etwas schneller als entweder x===true || x===falseoder typeof x==="boolean"(und viel schneller als x===Boolean(x)) zu sein.

Dann gibt es auch noch

function is_regexp(x)  { return x === RegExp(x); }

All dies hängt von der Existenz einer "Identitäts" -Operation ab, die für jeden Typ spezifisch ist und auf jeden Wert angewendet werden kann und zuverlässig einen Wert des fraglichen Typs erzeugt. Ich kann mir keine solche Operation für Daten vorstellen.

Für NaN gibt es

function is_nan(x) { return x !== x;}

Dies ist im Grunde genommen die Version des Unterstrichs, und sie ist derzeit etwa viermal schneller als isNaN(), aber die Kommentare in der Unterstrichquelle erwähnen, dass "NaN die einzige Zahl ist , die sich selbst nicht entspricht" und fügen eine Prüfung für _.isNumber hinzu. Warum? Welche anderen Objekte würden sich nicht selbst entsprechen? Auch Unterstrich verwendet - x !== +xaber welchen Unterschied könnte das +hier machen?

Dann für die Paranoiden:

function is_undefined(x) { return x===[][0]; }

oder dieses

function is_undefined(x) { return x===void(0); }

1
x! == + x versucht zuerst, x in eine Zahl umzuwandeln.
Adrian Bartholomew

8

Kannst du es einfach durch 1 teilen?

Ich gehe davon aus, dass das Problem eine Zeichenfolgeneingabe wie "123ABG" ist.

var Check = "123ABG"

if(Check == Check / 1)
{
alert("This IS a number \n")
}

else
{
alert("This is NOT a number \n")
}

Nur so, wie ich es kürzlich gemacht habe.


Ich glaube nicht, dass er möchte, dass es wahr ist, wenn es eine Folge von Zahlen ist. Vielleicht verwenden Sie ===
Curtis

7

Wie wäre es nur mit:

function IsString(obj) {
    return obj !== undefined && obj != null && obj.toLowerCase !== undefined;
}

Nach einer weiteren Überprüfung viele Monate später wird nur garantiert, dass objes sich um ein Objekt handelt, für das der Methoden- oder Eigenschaftsname toLowerCasedefiniert ist. Ich schäme mich für meine Antwort. Bitte sehen Sie die am besten gewählte typeof.


7

Oder verwenden Sie einfach die Umkehrung von isNaN():

if(!isNaN(data))
  do something with the number
else
  it is a string

Und ja, die Verwendung von jQuery's $.isNumeric()macht mehr Spaß.


isNaN('123')gibt false, obwohl das Argument eine numerische Zeichenfolge und kein numerischer Typ ist
JustAMartin

6

Ich denke, das Konvertieren der Variable in eine Zeichenfolge verringert die Leistung, zumindest zeigt dieser in den neuesten Browsern durchgeführte Test dies.

Wenn Sie sich also für Leistung interessieren, würde ich Folgendes verwenden:

typeof str === "string" || str instanceof String

zum Überprüfen, ob die Variable eine Zeichenfolge ist (selbst wenn Sie verwenden var str = new String("foo"), str instanceof Stringwürde true zurückgegeben).

Um zu überprüfen, ob es eine Nummer ist, würde ich mich für den Eingeborenen entscheiden : isNaN; Funktion.


5

jQuery verwendet Folgendes:

function isNumber(obj) {
  return !isNaN( parseFloat( obj ) ) && isFinite( obj );
}

4

Diese Lösung löst viele der hier aufgeworfenen Probleme!

Dies ist bei weitem die zuverlässigste Methode, die ich bei weitem verwendet habe. Ich habe das nicht erfunden und kann mich nicht erinnern, wo ich es ursprünglich gefunden habe. Aber es funktioniert dort, wo andere Techniken versagen:

// Begin public utility /getVarType/
// Returns 'Function', 'Object', 'Array',
// 'String', 'Number', 'Boolean', or 'Undefined'
getVarType = function ( data ){
  if (undefined === data ){ return 'Undefined'; }
  if (data === null ){ return 'Null'; }
  return {}.toString.call(data).slice(8, -1);
};  
// End public utility /getVarType/

Beispiel für Richtigkeit

var str = new String();
console.warn( getVarType(str) ); // Reports "String"    
console.warn( typeof str );      // Reports "object"

var num = new Number();
console.warn( getVarType(num) ); // Reports "Number"
console.warn( typeof num );      // Reports "object"

var list = [];
console.warn( getVarType( list ) ); // Reports "Array"
console.warn( typeof list );        // Reports "object"

2
Und es ist sehr langsam.

Tarazaburo, ich weiß nicht, woher Sie Ihre Daten bekommen, aber ein kleines Benchmarking ist angebracht:
Michael Mikowski

Ich finde das nicht "wirklich langsam". typeofWenn ich eine Geschwindigkeit von mehr als 1 Million Iterationen teste , finde ich, dass sie nicht schlechter als die Hälfte der Geschwindigkeit der nativen Methode (0,788 s gegenüber 1,481 s) in Chrome ist. Dies ist angesichts der verbesserten Ergebnisse sicherlich eine akzeptable Leistung. Warum denkst du, ist es "sehr langsam"? Vielleicht ist es - in IE6 / 7/8? Aber in diesen Browsern ist alles "sehr langsam".
Michael Mikowski

Nun, das habe ich gesagt, weil ich das Benchmarking bereits durchgeführt hatte. Stellen Sie unter jsperf.com/check-typeof-number-again ein neues kleines zusammen und es typeofist 100x schneller. Was fehlt mir?

Sie vermissen die Tatsache, dass 3 Millionen Operationen / s für die meisten Codes bei der Überprüfung des Typs kein Problem darstellen. Ich würde das in keiner Weise "wirklich langsam" nennen. Mein Benchmark sah folgendermaßen aus: var i, k, start = + new Date (); für (i = 0; i <1000000; i ++) {k = typeof ('foo'); k = Typ von (123,5); }; Ende = + neues Datum (); console.log (Ende - Start);
Michael Mikowski


4

Typ funktioniert in den meisten Fällen sehr gut für mich. Sie können versuchen, eine if-Anweisung zu verwenden

if(typeof x === 'string' || typeof x === 'number') {
    console.log("Your statement");
}

Dabei ist x ein beliebiger Variablenname Ihrer Wahl


Was fügt diese Antwort der am meisten bewerteten hinzu?
Bartek Banachewicz

2
Einfachheit und Klarheit?
Tim Erickson

3

Der beste Weg, den ich gefunden habe, der auch an positive und negative Zahlen denkt, ist von: O'Reilly Javascript und DHTML Cookbook :

function isNumber(elem) {
var str = elem.value;
var oneDecimal = false;
var oneChar = 0;
// make sure value hasn't cast to a number data type
str = str.toString( );
for (var i = 0; i < str.length; i++) {
    oneChar = str.charAt(i).charCodeAt(0);
    // OK for minus sign as first character
    if (oneChar =  = 45) {
        if (i =  = 0) {
            continue;
        } else {
            alert("Only the first character may be a minus sign.");
            return false;
        }
    }
    // OK for one decimal point
    if (oneChar =  = 46) {
        if (!oneDecimal) {
            oneDecimal = true;
            continue;
        } else {
            alert("Only one decimal is allowed in a number.");
            return false;
        }
    }
    // characters outside of 0 through 9 not OK
    if (oneChar < 48 || oneChar > 57) {
        alert("Enter only numbers into the field.");
        return false;
    }
}
return true;

}}


3

Errr? Verwenden Sie einfach reguläre Ausdrücke! :) :)

function isInteger(val) {
  return val.match(/^[0-9]$/)
}

function isFloat(val) {
  return val.match(/^[0-9]*/\.[0-9]+$/)
}

3

Da eine Zeichenfolge als '1234' mit typeof 'string' anzeigt und die Umkehrung niemals passieren kann (typeof 123 ist immer eine Zahl), ist es am besten, einen einfachen regulären Ausdruck zu verwenden /^\-?\d+$/.test(var). Oder eine fortgeschrittenere Methode, um Floats, Ganzzahlen und negative Zahlen abzugleichen. /^[\-\+]?[\d]+\.?(\d+)?$/ Die wichtige Seite .testist, dass keine Ausnahme ausgelöst wird, wenn die Variable keine Zeichenfolge ist. Der Wert kann beliebig sein.

var val, regex = /^[\-\+]?[\d]+\.?(\d+)?$/;

regex.test(val)       // false 
val = '1234';
regex.test(val)       // true
val = '-213';
regex.test(val)       // true
val = '-213.2312';
regex.test(val)       // true
val = '+213.2312';
regex.test(val)       // true
val = 123;
regex.test(val)       // true
val = new Number(123);
regex.test(val)       // true
val = new String('123');
regex.test(val)       // true
val = '1234e';
regex.test(val)       // false 
val = {};
regex.test(val)       // false 
val = false;
regex.test(val)       // false 
regex.test(undefined) // false 
regex.test(null)      // false 
regex.test(window)    // false 
regex.test(document)  // false 

Wenn Sie nach dem echten Typ suchen, reicht nur typeof aus.


3

Die Antwort von @ BitOfUniverse ist gut und ich habe einen neuen Weg gefunden:

function isNum(n) {
    return !isNaN(n/0);
}

isNum('')  // false
isNum(2)   // true
isNum('2k') // false
isNum('2')  //true

Ich weiß, 0kann keine Dividende sein, aber hier funktioniert die Funktion perfekt.


2

Typprüfung

Sie können den Variablentyp mit dem typeofOperator überprüfen :

typeof variable

Wertprüfung

Der folgende Code gibt true für Zahlen und false für alles andere zurück:

!isNaN(+variable);

var variable = '123'; console.log (! isNaN (+ Variable)); gibt wahr, obwohl es eine Zeichenfolge und kein
Zahlentyp ist

Weil '123' eine Zahl ist! Wenn Sie den Typ der Variablen kennen möchten, können Sie einfach den typeofOperator verwenden! @ JustAMartin
Amir Fo

Ja, aber die ursprüngliche Frage bestand darin, alle Variablen vom Typ String von Variablen vom Typ Number zu unterscheiden. '123` ist immer noch eine Zeichenfolge. Wenn ich 123 übergebe, sollte die Antwort lauten, numberaber wenn ich '123' oder 'abc' oder ein anderes zitiertes Literal übergebe, ist es eine Zeichenfolge, und es spielt keine Rolle, ob es in eine Zahl analysiert werden kann oder nicht.
JustAMartin

@ JustAMartin Ok, ich habe meine Antwort bearbeitet.
Amir Fo

1

Die XOR-Operation kann zum Erkennen von Zahlen oder Zeichenfolgen verwendet werden. Zahl ^ 0 gibt immer die Zahl als Ausgabe an und Zeichenfolge ^ 0 gibt 0 als Ausgabe an.

Example: 
   1)  2 ^ 0 = 2
   2)  '2' ^ 0  = 2
   3)  'Str' ^ 0 = 0

1

Einfach und gründlich:

function isNumber(x) {
  return parseFloat(x) == x
};

Testfälle:

console.log('***TRUE CASES***');
console.log(isNumber(0));
console.log(isNumber(-1));
console.log(isNumber(-500));
console.log(isNumber(15000));
console.log(isNumber(0.35));
console.log(isNumber(-10.35));
console.log(isNumber(2.534e25));
console.log(isNumber('2.534e25'));
console.log(isNumber('52334'));
console.log(isNumber('-234'));
console.log(isNumber(Infinity));
console.log(isNumber(-Infinity));
console.log(isNumber('Infinity'));
console.log(isNumber('-Infinity'));

console.log('***FALSE CASES***');
console.log(isNumber(NaN));
console.log(isNumber({}));
console.log(isNumber([]));
console.log(isNumber(''));
console.log(isNumber('one'));
console.log(isNumber(true));
console.log(isNumber(false));
console.log(isNumber());
console.log(isNumber(undefined));
console.log(isNumber(null));
console.log(isNumber('-234aa'));

0

Einfach benutzen

myVar.constructor == String

oder

myVar.constructor == Number

Wenn Sie Zeichenfolgen verarbeiten möchten, die als Objekte oder Literale definiert und gespeichert sind, möchten Sie keine Hilfsfunktion verwenden.


0
function IsNumeric(num) {
    return ((num >=0 || num < 0)&& (parseInt(num)==num) );
}

0

Sehr spät zur Party; Das Folgende hat für mich jedoch immer gut funktioniert, wenn ich überprüfen möchte, ob eine Eingabe entweder eine Zeichenfolge oder eine Zahl auf einmal ist.

return !!Object.prototype.toString.call(input).match(/\[object (String|Number)\]/);

0

Erstellt ein jsperf bei der Überprüfung, ob eine Variable eine Zahl ist. Ziemlich interessant! Typ hat tatsächlich eine Leistungsverwendung. Wenn Sie typeofetwas anderes als Zahlen verwenden, beträgt die Geschwindigkeit im Allgemeinen ein variable.constructorDrittel, da die meisten Datentypen in Javascript Objekte sind. Zahlen sind nicht!

http://jsperf.com/jemiloii-fastest-method-to-check-if-type-is-a-number

typeof variable === 'number'| am schnellsten | Wenn Sie eine Zahl wie 5 und nicht '5'
typeof parseFloat(variable) === 'number'| möchten am schnellsten | Wenn Sie eine Zahl wie 5 und '5' möchten

isNaN()ist langsamer, aber nicht viel langsamer. Ich hatte große Hoffnungen auf parseIntund parseFloatsie waren jedoch schrecklich langsamer.


0

Für die Erkennung von Zahlen ist die folgende Passage aus JavaScript relevant: The Good Parts von Douglas Crockford:

Die isFinite-Funktion ist der beste Weg, um festzustellen, ob ein Wert als Zahl verwendet werden kann, da NaN und Infinity abgelehnt werden. Leider wird isFinite versuchen, seinen Operanden in eine Zahl umzuwandeln. Daher ist es kein guter Test, wenn ein Wert tatsächlich keine Zahl ist. Möglicherweise möchten Sie Ihre eigene isNumber-Funktion definieren:

var isNumber = function isNumber(value) { return typeof value === 'number' &&
            isFinite(value);
};
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.