Sie können den typeof
Operator verwenden:
var booleanValue = true;
var numericalValue = 354;
var stringValue = "This is a String";
var stringObject = new String( "This is a String Object" );
alert(typeof booleanValue) // displays "boolean"
alert(typeof numericalValue) // displays "number"
alert(typeof stringValue) // displays "string"
alert(typeof stringObject) // displays "object"
Beispiel von dieser Webseite . (Beispiel wurde jedoch leicht modifiziert).
Dies funktioniert bei mit erstellten Zeichenfolgen nicht wie erwartet new String()
, wird jedoch selten verwendet und gegen [1] [2] empfohlen . In den anderen Antworten erfahren Sie, wie Sie damit umgehen können, wenn Sie dies wünschen.
- Im Google JavaScript Style Guide heißt es, niemals primitive Objekt-Wrapper zu verwenden .
- Douglas Crockford empfahl, primitive Objektverpackungen zu verwerfen .
new String('foo')
, aber das spielt keine Rolle, da objektumschlossene Zeichenfolgen eine wertlose Funktion sind, die Sie nicht verwenden sollten. Der Google Style Guide verbietet sie , Douglas Crockford möchte, dass sie veraltet sind , und keine Bibliotheken verwenden sie. Stellen Sie sich vor, sie existieren nicht und verwenden Sie sietypeof
ohne Angst.typeof
dies ebenfalls veraltet ist ?Das funktioniert bei mir:
quelle
instanceof
Überprüfung hier sinnloses Rauschen ist, es sei denn, Sie befolgen einige sehr ungewöhnliche Codierungspraktiken, und diese Antwort erklärt nicht, was sie bewirkt oder warum Sie sie möglicherweise verwenden. Der einzige Grund, warum Sie es jemals brauchen würden, ist, wenn Sie objektumschlossene Zeichenfolgen verwenden, aber objektumschlossene Zeichenfolgen sind eine wertlose Funktion, die niemand verwendet, und Google und Crockford verurteilen beide als schlechte Praxis ( google-styleguide.googlecode.com/svn/). trunk /… , crockford.com/javascript/recommend.html ).typeof
undinstanceof
fühlen Sie sich wie ein guter Rat, wenn Ihr Code von anderen aufgerufen werden kann. @ MarkAmerys Randfall istpostmessage
wichtig, wenn Sie fragen "Was war ich geradepostmessage
d?" - aber Sie würden erwarten, dass dies an der Schnittstelle behandelt wird und sich nicht verbreiten darf. An anderer Stelle scheint es richtig zu sein, mit nicht veralteten Codierungsmethoden umzugehen, selbst wenn einige JS-Ästhetiker sie ablehnen. Kommentieren Sie Ihren Code NIEMALS als akzeptierenden String, es sei denn, dies ist wirklich der Fall!Da mehr als 580 Personen für eine falsche Antwort gestimmt haben und mehr als 800 für eine funktionierende Antwort im Stil einer Schrotflinte gestimmt haben, hielt ich es für sinnvoll, meine Antwort in einer einfacheren Form zu wiederholen, die jeder verstehen kann.
Oder inline (ich habe ein UltiSnip-Setup dafür):
Zu Ihrer Information, die Antwort von Pablo Santa Cruz ist falsch, weil es so
typeof new String("string")
istobject
Die Antwort von DRAX ist genau und funktional und sollte die richtige sein (da Pablo Santa Cruz definitiv falsch ist und ich nicht gegen die Volksabstimmung argumentieren werde).
Diese Antwort ist jedoch auch definitiv richtig und tatsächlich die beste Antwort (außer vielleicht für den Vorschlag, lodash / Unterstrich zu verwenden ). Haftungsausschluss: Ich habe zur Codebasis von lodash 4 beigetragen.
Meine ursprüngliche Antwort (die offensichtlich über viele Köpfe flog) lautet wie folgt:
Ich habe dies von underscore.js transkodiert:
Das definiert isString, isNumber usw.
In Node.js kann dies als Modul implementiert werden:
[Bearbeiten]:
Object.prototype.toString.call(x)
Funktioniert auch zur Abgrenzung zwischen Funktionen und asynchronen Funktionen:quelle
global || window
anstattwindow
aber das wäre ein schlechter Ansatz sein , ein Problem zu lösen , die Sie nicht an erster Stelle haben sollen).myObject+"" === myObject
, ob ein Objekt eine Zeichenfolge ist (oder noch besser, ich würde check überhaupt nicht in ein verhaltensgesteuertes Typsystem eingeben).toString
in der neu zu definierenObject.prototype
. Ich würde also argumentieren, dass estoString
bestenfalls eine schlechte Praxis ist, sich darauf zu verlassen, den Typ eines Objekts zu überprüfen.Ich empfehle die integrierten Funktionen von jQuery oder lodash / Underscore . Sie sind einfacher zu bedienen und leichter zu lesen.
Jede Funktion behandelt den erwähnten Fall DRAX ... das heißt, beide prüfen, ob (A) die Variable ein String-Literal oder (B) eine Instanz des String-Objekts ist. In beiden Fällen identifizieren diese Funktionen den Wert korrekt als Zeichenfolge.
lodash / Underscore.js
jQuery
Weitere Informationen finden Sie in der lodash-Dokumentation zu _.isString () .
Weitere Informationen finden Sie in der jQuery-Dokumentation zu $ .type () .
quelle
_.every()
ist anfangs etwas verwirrend und etwas so Einfaches, wie_.isBoolean()
es Entwickler in meiner Firma verwirrt hat. Ein Entwickler dachte fälschlicherweise, es wäre falsch, wenn der Wert ein Boolescher Wert und falsch wäre. Englisch ist für mich leichter zu lesen als Deutsch, weil ich kein Deutsch kann. Lernen Sie JavaScript und alles wird Sinn machen.Das habe ich hier gesehen:
http://perfectionkills.com/instanceof-considered-harmful-or-how-to-write-a-robust-isarray/
quelle
Object.prototype.toString.call(obj) === '[object String]'
?(x === y)
hat eine bessere Lesbarkeit alsx === y
?Bester Weg:
Jedes von diesen wurde durch seine entsprechende Klassenfunktion wie "new Object ()" usw. konstruiert.
Ententypisierung: "Wenn es wie eine Ente aussieht, wie eine Ente läuft und wie eine Ente riecht - es muss ein Array sein" bedeutet, überprüfen Sie seine Eigenschaften.
Hoffe das hilft.
Bearbeiten; 12/05/2016
Denken Sie daran, dass Sie auch immer Kombinationen von Ansätzen verwenden können. Hier ist ein Beispiel für die Verwendung einer Inline-Karte von Aktionen mit typeof :
Hier ist ein realistischeres Beispiel für die Verwendung von Inline-Maps:
Diese Funktion würde [benutzerdefinierte] "Typumwandlung" - eher "Typ - / - Wertzuordnung" - verwenden, um herauszufinden, ob eine Variable tatsächlich "existiert". Jetzt können Sie das böse Haar zwischen
null
& aufteilen0
!Oft interessiert man sich nicht einmal für seinen Typ . Eine andere Möglichkeit, das Tippen zu umgehen, besteht darin, Duck-Type-Sets zu kombinieren:
Beide
Number.prototype
undString.prototype
haben eine.toString() method
. Sie haben nur sichergestellt, dass das Zeichenfolgenäquivalent der Zahl identisch ist, und dann haben Sie sichergestellt, dass Sie es alshttp
Funktion an die Funktion übergeben habenNumber
. Mit anderen Worten, es war uns egal welchen Typ es sich handelte.Hoffe das gibt dir mehr zum arbeiten :)
quelle
(o.constructor === Number || s.constructor === Boolean)
). AnekdotischparseInt
undNaN
sind zerbrechliche, aber mächtige Werkzeuge. Denken Sie daran, dass Not-a-Number NICHT Not-a-Number ist und undefiniert definiert werden kann.if(thing.call) { 'its a function'; }
oderif(thing.defineProperties) { 'its an object'; }
. Danke für die Eingabe, Axkibe!Ich kann ehrlich gesagt nicht verstehen, warum man
typeof
in diesem Fall nicht einfach verwenden würde :Ja, es wird gegen objektumhüllte Zeichenfolgen (z. B.
new String('foo')
) fehlschlagen, aber diese werden allgemein als schlechte Praxis angesehen, und die meisten modernen Entwicklungswerkzeuge werden wahrscheinlich von ihrer Verwendung abraten. (Wenn Sie eine sehen, beheben Sie sie einfach!)Der
Object.prototype.toString
Trick ist etwas, das alle Front-End-Entwickler eines Tages in ihrer Karriere für schuldig befunden haben, aber lassen Sie sich nicht von seinem cleveren Glanz täuschen: Er wird kaputt gehen, sobald der Affen-Prototyp von einem Affen gepatcht wird:quelle
Ich verwende gerne diese einfache Lösung:
quelle
undefined
und umzugehennull
und dennoch die richtige Antwort für leere Zeichenfolgen (sowohl''
als auchnew String('')
) zu erhalten.(mystring || false) && mystring.constructor === String
. Ich habe false verwendet, falls es in einer Funktion verwendet wird, die einen Booleschen Wert zurückgeben muss.Dies ist ein gutes Beispiel dafür, warum Leistung wichtig ist:
Etwas so Einfaches wie einen Test für einen String zu machen, kann teuer sein, wenn es nicht richtig gemacht wird.
Wenn ich beispielsweise eine Funktion schreiben wollte, um zu testen, ob etwas eine Zeichenfolge ist, kann ich dies auf zwei Arten tun:
1)
const isString = str => (Object.prototype.toString.call(str) === '[object String]');
2)
const isString = str => ((typeof str === 'string') || (str instanceof String));
Beide sind ziemlich einfach. Was könnte sich also möglicherweise auf die Leistung auswirken? Im Allgemeinen können Funktionsaufrufe teuer sein, insbesondere wenn Sie nicht wissen, was im Inneren passiert. Im ersten Beispiel gibt es einen Funktionsaufruf für die toString-Methode von Object. Im zweiten Beispiel gibt es keine Funktionsaufrufe, da typeof und instanceof Operatoren sind. Operatoren sind deutlich schneller als Funktionsaufrufe.
Wenn die Leistung getestet wird, ist Beispiel 1 79% langsamer als Beispiel 2!
Siehe die Tests: https://jsperf.com/isstringtype
quelle
typeof str === 'string' || str instanceof String
(kann die Klammer fallen lassen, die ich inif (..)
Fällen bevorzuge ); Unabhängig davon ist es klar und ausreichend, sowohl den primitiven als auch den Objekttyp in # 2 zu überprüfen. Diese Überprüfungen sollten sowieso "selten" sein.Funktioniert sowohl für Zeichenfolgenliterale
let s = 'blah'
als auch für Objektzeichenfolgenlet s = new String('blah')
quelle
Entnommen aus lodash:
quelle
Ich denke, dass die @ customcommander-Lösung in 90% Ihrer Fälle ausreichen sollte:
Sollte dir recht geben (einfach da es normalerweise keinen Grund gibt zu haben
new String('something')
in Ihrem Code ).Wenn Sie daran interessiert sind, die
String
Objekts (zum Beispiel erwarten Sie eine Variation von einem Drittanbieter), scheint die Verwendung von lodash als @ ClearCloud8 vorgeschlagen eine klare, einfache und elegante Lösung zu sein.Ich würde jedoch empfehlen, mit Bibliotheken wie lodash aufgrund ihrer Größe vorsichtig zu sein. Anstatt zu tun
Was das ganze riesige Lodash-Objekt bringt, würde ich so etwas vorschlagen:
Und mit einfacher Bündelung sollte es Ihnen gut gehen (ich beziehe mich hier auf Client-Code).
quelle
Wenn Sie in der Umgebung von node.js arbeiten, können Sie einfach die integrierte Funktion isString in utils verwenden.
Bearbeiten: Wie @Jehy erwähnt, ist dies seit v4 veraltet.
quelle
typeof value === 'string'
Stattdessen verwenden".x = new String('x'); x.isString(x);
gibt false zurück . Es gibtutil.types.isStringObject()
aber false für denx = 'x'
Typ string. Zwei Dienstprogrammfunktionen, die absolut kein Dienstprogramm bieten ...Die folgende Methode überprüft, ob eine Variable eine Zeichenfolge ist ( einschließlich nicht vorhandener Variablen ).
quelle
Ich fand auch, dass dies auch gut funktioniert und es ist viel kürzer als die anderen Beispiele.
Durch Verketten mit leeren Anführungszeichen wird der Wert in eine Zeichenfolge umgewandelt. Wenn
myVar
es sich bereits um eine Zeichenfolge handelt, ist die if-Anweisung erfolgreich.quelle
typeof
.typeof
aber immer noch ziemlich viel schneller alstoString
. Wie auch immer, ich denke, ich mag nur die Syntax für das Erzwingen.var s = new String('abc'); > s === s + '' > false
new String
cus, das eine Art von erstelltobject
. w3schools.com/js/tryit.asp?filename=tryjs_string_object2quelle
false
.Ich finde diese einfache Technik nützlich, um nach Zeichenfolgen zu suchen -
Die gleiche Technik funktioniert auch für Number -
Und für RegExp -
Gleiches gilt für Objekt -
NB, reguläre Ausdrücke, Arrays und Funktionen werden ebenfalls als Objekte betrachtet.
Die Suche nach Arrays ist jedoch etwas anders -
Diese Technik funktioniert jedoch nicht für Funktionen -
quelle
var x = new String(x); String(x)===x
gibt false zurück.({}).toString.call(x).search(/String/)>0
kehrt jedoch immer für strenge Dinge zurückfunction isClass(x,re){return ({}).toString.call(x).search(re)>0;};
isClass("hello",/String/)
oderisClass(3,/Number/)
oderisClass(null,/Null/)
Eine einfache Lösung wäre:
quelle
toString()
Funktion.toString
keine Werte blind aufrufen . Versuchen Sie, wenn das zu überprüfende x null oder undefiniert ist, Ihre Code-toString()
Methode möglicherweise überschrieben wird und eine Ausnahme auslöst (aufgrund einer bestimmten Implementierung) und Ihre Prüfung nicht sicher funktioniert. Die Hauptidee ist, dass Sie keine Methoden aufrufen sollten, die nicht mit dem zusammenhängen, was Sie erhalten möchten. Ich spreche nicht einmal von unnötigem Overhead im Zusammenhang mit dertoString
Methode. Downvoting.Ein Typechecker-Helfer:
Verwendungszweck:
Auch wenn Sie möchten, dass es rekursiv ist (wie Array, das ein Objekt ist), können Sie es verwenden
instanceof
.(
['cs'] instanceof Object //true
)quelle
Ich werde hier einen anderen Weg als den Rest gehen und versuchen festzustellen, ob eine Variable ein bestimmter Typ oder ein Mitglied eines bestimmten Satzes von Typen ist.
JS basiert auf ducktyping; Wenn etwas wie eine Schnur quakt, können und sollten wir es wie eine Schnur verwenden.
Ist
7
eine Zeichenfolge? Warum funktioniert/\d/.test(7)
dann?Ist
{toString:()=>('hello there')}
eine Zeichenfolge? Warum funktioniert({toString:()=>('hello there')}) + '\ngeneral kenobi!'
dann?Dies sind keine Fragen zu sollten das oben Genannte funktionieren, der Punkt ist, dass sie es tun.
Also habe ich eine
duckyString()
Funktion erstellt. ImFolgenden teste ich viele Fälle, die von anderen Antworten nicht berücksichtigt werden. Für jeden Code:
duckyString()
zu zeigen, wie Sie Eingaben für Code normalisieren können, der echte Zeichenfolgen erwartetDies ist in der gleichen Weise wie
!!x
im Gegensatz zux===true
und Testen, ob etwas Array- ähnlich ist, anstatt ein tatsächliches Array zu erfordern.jQuery-Objekte; sind sie Arrays? Sind sie gut genug? Ja, Sie können sie problemlos durch
Array.prototype
Funktionen ausführen .Es ist diese Flexibilität, die JS seine Leistungsfähigkeit verleiht, und das Testen auf Zeichenfolgen macht Ihren Code weniger interoperabel.
Die Ausgabe der oben genannten ist:
Es geht also darum, warum Sie wissen möchten, ob etwas eine Zeichenfolge ist.
Wenn Sie wie ich von Google hierher gekommen sind und sehen möchten, ob etwas stringartig ist , finden Sie hier eine Antwort.
Es ist nicht einmal teuer, wenn Sie nicht mit wirklich langen oder tief verschachtelten Char-Arrays arbeiten.
Dies liegt daran, dass es sich bei allen if-Anweisungen um keine Funktionsaufrufe handelt
.toString()
.Außer wenn Sie versuchen zu sehen, ob ein char-Array Objekte enthält, die nur aus
toString()
Zeichen oder Multibyte-Zeichen bestehen. In diesem Fall gibt es keine andere Möglichkeit, dies zu überprüfen, als die Zeichenfolge zu erstellen und die Zeichen zu zählen, aus denen die Bytes bestehenEnthalten sind Optionen zu
.toString()
)Hier sind weitere Tests, weil ich ein Vervollständiger bin:
Ausgabe:
quelle
Um die Antwort von @ DRAX zu erweitern , würde ich Folgendes tun:
Es berücksichtigt auch
null
s undundefined
Typen und kümmert sich um Nicht-String-Typen, wie z0
.quelle
Das ist gut genug für mich.
WARNUNG: Dies ist keine perfekte Lösung. Siehe den Ende meines Beitrags.
Und Sie können dies wie unten verwenden.
WARNUNG: Dies funktioniert nicht in dem Fall:
quelle
Mit dieser Funktion können Sie den Typ von allem bestimmen:
So überprüfen Sie, ob eine Variable eine Zeichenfolge ist:
https://codepen.io/patodiblasi/pen/NQXPwY?editors=0012
quelle
Ich bin mir nicht sicher, ob Sie wissen wollen, ob es sich um einen Typ handelt,
string
unabhängig von seinem Inhalt, oder ob es sich bei dem Inhalt um eine Zahl oder eine Zeichenfolge handelt, unabhängig von seinem Typ.Um zu wissen, ob es sich bei dem Typ um eine Zeichenfolge handelt, wurde diese bereits beantwortet.
Aber um anhand des Inhalts zu wissen, ob es sich um eine Zeichenfolge oder eine Zahl handelt, würde ich Folgendes verwenden:
Und für einige Beispiele:
quelle
/^\d+$/.test('123')
, um die