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.


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)

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

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)


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

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


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)


0

Versuchen Sie diesen Code:

 alert(typeof(1) == "number");

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.
}

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
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.