Typprüfung in Javascript

76

Wie kann ich überprüfen, ob eine Variable derzeit ein ganzzahliger Typ ist? Ich habe nach einer Ressource dafür gesucht und denke, dass der Operator === wichtig ist, aber ich bin nicht sicher, wie ich überprüfen soll, ob eine Variable eine Ganzzahl (oder ein Array für diese Angelegenheit) ist.

sova
quelle
9
== prüft auf Wertgleichheit, === prüft auf Wert- und Typgleichheit. "1" == 1 wäre wahr, "1" === 1 wäre falsch
Kai
Sie können eine sehr kleine Bibliothek wie Not verwenden . Löst alle Probleme.
Calvintwr

Antworten:

124

Eine Variable wird in JavaScript niemals ein ganzzahliger Typ sein - sie unterscheidet nicht zwischen verschiedenen Arten von Zahlen.

Sie können testen, ob die Variable eine Zahl enthält und ob diese Zahl eine Ganzzahl ist.

(typeof foo === "number") && Math.floor(foo) === foo

Wenn die Variable eine Zeichenfolge sein kann, die eine Ganzzahl enthält, und Sie sehen möchten, ob dies der Fall ist:

foo == parseInt(foo, 10)
QUentin
quelle
2
Sie können auch isNaN (foo) w3schools.com/jsref/jsref_NaN.asp anstelle von typeof
m4tt1mus
4
"Es wird nicht zwischen verschiedenen Arten von Zahlen unterschieden" Das liegt daran, dass es keine verschiedenen Arten von Zahlen gibt. Alle numerischen Werte in JS sind 64-Bit-Gleitkommazahlen.
NullUserException
1
@NullUserException - Das habe ich gesagt.
Quentin
Wenn Sie jQuery verwenden, können Sie die Funktion $ .type () verwenden. Ex. $ .type ("1") # => "string"
Andrei
2
Diese Antwort sollte aktualisiert werden, da sie nicht mit der Funktion Number.isInteger von ECMAScript 2015 übereinstimmt . Es sollte für Infinity false zurückgeben , nicht true.
RobG
16

In diesen Tagen ist ECMAScript 6 (ECMA-262) "im Haus". Verwenden Number.isInteger(x)Sie diese Option , um die Frage zu stellen, die Sie in Bezug auf den Typ von x stellen möchten:

js> var x = 3
js> Number.isInteger(x)
true
js> var y = 3.1
js> Number.isInteger(y)
false
dat
quelle
7

Eine Zahl ist eine ganze Zahl, wenn ihr Modulo% 1 0- ist.

function isInt(n){
    return (typeof n== 'number' && n%1== 0);
}

Dies ist nur so gut, wie Javascript bis zum 15. + - zehn bekommt.

isInt(Math.pow(2,50)+.1)kehrt zurück true, wie es tut Math.pow(2,50)+.1 == Math.pow(2,50)

kennebec
quelle
0

Ich weiß, dass Sie an ganzzahligen Zahlen interessiert sind, daher werde ich darauf nicht antworten. Wenn Sie jedoch jemals nach Gleitkommazahlen suchen wollten, können Sie dies tun.

function isFloat( x )
{
    return ( typeof x === "number" && Math.abs( x % 1 ) > 0);
}

Hinweis: Dies kann Zahlen, die mit .0(oder einer logisch äquivalenten Anzahl von 0) enden, als INTEGER behandeln. In diesem Fall muss tatsächlich ein Gleitkomma-Genauigkeitsfehler auftreten, um die Gleitkommawerte zu erkennen.

Ex.

alert(isFloat(5.2));   //returns true
alert(isFloat(5));     //returns false
alert(isFloat(5.0));   //return could be either true or false
Dan
quelle
0

Nicht wenige Dienstprogrammbibliotheken wie YourJS bieten Funktionen zum Bestimmen, ob es sich bei einem Array um ein Array handelt oder ob es sich bei etwas um eine Ganzzahl oder um viele andere Typen handelt. YourJS definiert isInt, indem überprüft wird, ob der Wert eine Zahl ist und ob er durch 1 teilbar ist:

function isInt(x) {
  return typeOf(x, 'Number') && x % 1 == 0;
}

Das obige Snippet wurde diesem YourJS-Snippet entnommen und funktioniert daher nur, weil typeOfes von der Bibliothek definiert wird. Sie können eine minimalistische Version von YourJS herunterladen , die in erster Linie nur die Typprüfung Funktionen wie hat typeOf(), isInt()und isArray(): http://yourjs.com/snippets/build/34,2

Chris West
quelle
0

Sie können sich auch Runtyper ansehen - ein Tool, das die Typprüfung von Operanden in ===(und anderen Operationen) durchführt.
Wenn Sie in Ihrem Beispiel einen strengen Vergleich haben x === yund x = 123, y = "123", wird automatisch typeof x, typeof yeine Warnung in der Konsole überprüft und angezeigt:

Strenger Vergleich verschiedener Typen: 123 (Nummer) === "123" (Zeichenfolge)

Vitalets
quelle
0

Versuchen Sie diesen Code:

 alert(typeof(1) == "number");
eSniff
quelle
0

Ein sauberer Ansatz

Sie können eine sehr kleine, abhängigkeitsfreie Bibliothek wie Not verwenden . Löst alle Probleme:

// at the basic level it supports primitives
let number = 10
let array = []
not('number', 10) // returns false
not('number', []) // throws error

// so you need to define your own:
let not = Object.create(Not)

not.defineType({
    primitive: 'number',
    type: 'integer',
    pass: function(candidate) {
        // pre-ECMA6
        return candidate.toFixed(0) === candidate.toString()
        // ECMA6
        return Number.isInteger(candidate)
    }
})
not.not('integer', 4.4) // gives error message
not.is('integer', 4.4) // returns false
not.is('integer', 8) // returns true

Wenn Sie es sich zur Gewohnheit machen, wird Ihr Code viel stärker. Typoskript löst einen Teil des Problems, funktioniert aber zur Laufzeit nicht, was ebenfalls wichtig ist.

function test (string, boolean) {
    // any of these below will throw errors to protect you
    not('string', string)
    not('boolean', boolean)

    // continue with your code.
}
Calvintwr
quelle
1
Könnten Sie bitte erklären, wie Sie mit dieser Technik überprüfen können, ob etwas eine Ganzzahl ist?
Sova
@sova Ich habe das Beispiel hinzugefügt.
Calvintwr