Warum instanceof false zurück für einige Literale?
"foo" instanceof String //=> false
"foo" instanceof Object //=> false
true instanceof Boolean //=> false
true instanceof Object //=> false
false instanceof Boolean //=> false
false instanceof Object //=> false
//the tests against Object really don't make sense
Array-Literale und Objekt-Literale entsprechen...
[0,1] instanceof Array //=> true
{0:1} instanceof Object //=> true
Warum nicht alle? Oder, warum nicht Sie alle nicht?
Und, was sind Sie eine Instanz, dann?
Es ist das gleiche wie im FF3, IE7, Opera und Chrome. So, es ist zumindest konsequent.
Verpasste ein paar.
12.21 instanceof Number //=> false
/foo/ instanceof RegExp //=> true
InformationsquelleAutor Jonathan Lonowski | 2008-10-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Primitive sind eine andere Art von Art als Objekte, die aus innerhalb von Javascript. Aus der Mozilla API-docs:
Ich finde keine Möglichkeit zum erstellen primitive Typen mit code, vielleicht ist es nicht möglich. Dies ist wahrscheinlich, warum Menschen nutzen
typeof "foo" === "string"
stattinstanceof
.Einen einfachen Weg, sich Dinge zu merken, wie das ist, Fragen sich, "ich Frage mich, was wäre, gesund und leicht zu lernen"? Was auch immer die Antwort ist, Javascript ist die andere Sache.
Jeden Tag mit einem neuen Grund zu hassen JavaScript ist ein guter Tag. Ich weiß, es ist lange überfällig, aber ich danke dir für diesen Beitrag.
Deine Terminologie ist falsch. Das Wort "literal" bezieht sich auf eine syntax für die Erstellung von Daten, ohne mit einem Konstruktor. Es bezieht sich nicht auf die daraus resultierenden Daten. Literal-syntax kann verwendet werden, um beide Objekte und nicht-Objekte. Die korrekte Bezeichnung ist "primitive", welche sich auf nicht-Objekt-Daten. Einige Daten hat der primitive und Objekt-Repräsentationen. Zeichenfolge ist einer dieser Typen von Daten.
FYI, können Sie erstellen primitive ohne literal-syntax.
(new String()).valueOf();
Beachten Sie, dass
typeof foo === 'string'
ist nicht genug: siehe axkibe Antwort.InformationsquelleAutor John Millikin
Benutze ich:
Weil in JavaScript-strings werden können Literale oder Objekte.
function isString(s) { return s.constructor === String; }
Funktioniert für Literale und string-Objekte (zumindest in V8)Gotta love JavaScript.
Ich benutze jQuery.Typ(s) === 'string' (api.jquery.com/jquery.type), jQuery.isArray(), jQuery.isFunction(), jQuery.isNumeric (), wenn es möglich ist.
während du hast Recht, es ist nicht annähernd so performant als
typeof
.Sie können typeof "?" == String.name.toLowerCase() [aber warum ist [] instanceof Array ?]
InformationsquelleAutor axkibe
In JavaScript ist alles ein Objekt (oder können zumindest so behandelt werden, als ein Objekt), außer primitive (Boolean, null, zahlen, strings und der Wert
undefined
(und symbol in ES6)):Wie Sie sehen können, Objekte, arrays und der Wert
null
sind alle betrachteten Objekte (null
ist eine Referenz auf ein Objekt, das nicht vorhanden ist). Die Funktionen unterscheiden sich, denn Sie sind eine Besondere Art von callable Objekte. Aber Sie sind immer noch Objekte.Auf der anderen Seite die Literale
true
,0
,""
undundefined
sind keine Objekte. Sie sind primitive Werte in JavaScript. Allerdings Boolesche Werte, zahlen und Zeichenketten haben auch KonstruktorenBoolean
,Number
undString
bzw. die wickeln Ihre jeweiligen primitive, um bereitzustellen, dass Funktion hinzufügte:Wie Sie sehen können, wenn die Grundwerte sind, eingehüllt in die
Boolean
,Number
undString
Konstruktoren bzw. Sie werden zu Objekten. Dieinstanceof
- operator funktioniert nur für Objekte, (die ist, warum gibt esfalse
für primitive Werte):Wie Sie sehen können beide
typeof
undinstanceof
sind nicht ausreichend, um zu testen, ob ein Wert ein boolean, eine Zahl oder ein string -typeof
funktioniert nur für primitive Boolesche Werte, zahlen und Zeichenketten; undinstanceof
funktioniert nicht für primitive Boolesche Werte, zahlen und Zeichenketten.Glücklicherweise gibt es eine einfache Lösung für dieses problem. Die default-Implementierung von
toString
(D. H., wie es systemintern definiertObject.prototype.toString
) liefert die interne[[Class]]
Eigenschaft der beiden primitive Werte und Objekte:Den internen
[[Class]]
- Eigenschaft der Wert ist viel nützlicher als dietypeof
den Wert. Wir könnenObject.prototype.toString
erstellen unsere eigene (weitere nützliche) version von dertypeof
- operator wie folgt:Hoffe, dieser Artikel geholfen. Erfahren Sie mehr über die Unterschiede zwischen primitiven und verpackten Objekten Lesen Sie die folgenden blog-post: Das Geheime Leben der JavaScript Primitive
null
ist ein Grundwert (nur dietypeof
Betreiber ist verwirrend)InformationsquelleAutor Aadit M Shah
Können Sie constructor-Eigenschaft:
String
undBoolean
im obigen Beispiel, also, wenn Sie die Prüfung derconstructor
Eigenschaft eine string-variable erstellt, die in einem anderen Fenster (wie ein popup oder frame) wird es nicht gleich einfachString
es wird gleichthatOtherWindowsName.String
.Und nicht ein Angebot mit dieses und geben Sie die entsprechenden boolean-Ergebnis?
dieser schlägt fehl, wenn Sie ' re übergeben ein Nachkomme von String.
Dies funktioniert, um das abzustellen:
Object.prototype.toString.call('foo') === '[object String]'
und @MichaelMathews gibt es irgendein Problem bei der Verwendung
d.constructor == String
? E. g. mit einem lockeren Gleichheitsoperator.InformationsquelleAutor user144049
können Sie diese verwenden, wird es funktionieren, sowohl für den Fall, als
var text="foo";
//typeof funktioniertString text= new String("foo");
//instanceof funktioniertInformationsquelleAutor saurabhgoyal795
Ich glaube, ich habe eine praktikable Lösung:
InformationsquelleAutor Robby Harris
https://www.npmjs.com/package/typeof
Gibt eine string-Darstellung des
instanceof
(die Konstruktoren name)InformationsquelleAutor samdd
Für mich die Verwirrung, die durch
So
"str" istanceof String
zurückkehren solltetrue
denn wie istanceof funktioniert wie folgt:Ergebnisse der expression #1 und #2 Konflikt miteinander, so sollte es sein, einer von Ihnen falsch.
#1 ist falsch
Ich heraus, dass es verursacht durch die
__proto__
ist nicht-standard-Eigenschaft, so dass die Verwendung der standard:Object.getPrototypeOf
Nun, es gibt keine Verwirrung zwischen Ausdruck #2 und #3
Object("str").__proto__
oderObject("str") instanceof String
.vielen Dank für diesen Hinweis. Ich wusste gar nicht, dass
InformationsquelleAutor mko
Oder können Sie nur Ihre eigene Funktion, etwa so:
Verwendung:
Diese sollten beide true zurück.
InformationsquelleAutor