"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 stimmen überein ...
[0,1] instanceof Array //=> true
{0:1} instanceof Object //=> true
Warum nicht alle? Oder warum nicht alle nicht ?
Und wofür sind sie dann ein Beispiel?
Dies gilt auch für FF3, IE7, Opera und Chrome. Zumindest ist es also konsistent.
Habe ein paar verpasst.
12.21 instanceof Number //=> false
/foo/ instanceof RegExp //=> true
quelle
(new String()).valueOf();
typeof foo === 'string'
nicht ausreicht: Siehe die Antwort von axkibe.typeof new String('')
kehrt"object"
Ich benutze:
Denn in JavaScript können Zeichenfolgen Literale oder Objekte sein.
quelle
function isString(s) { return s.constructor === String; }
Funktioniert für Literale und String-Objekte (zumindest in V8)typeof
.In JavaScript ist alles ein Objekt (oder zumindest als ein Objekt behandelt werden), mit Ausnahme Primitiven (booleans, null, Zahlen, Strings und dem Wert
undefined
(und das Symbol in ES6)):Wie Sie sehen können, werden Arrays und der Wert
null
alle als Objekte betrachtet (null
ist ein Verweis auf ein Objekt, das nicht existiert). Funktionen werden unterschieden, weil sie eine spezielle Art von aufrufbaren Objekten sind. Sie sind jedoch immer noch Objekte.Auf der anderen Seite der Literale
true
,0
,""
undundefined
sind nicht Objekte. Sie sind primitive Werte in JavaScript. Allerdings booleans, Zahlen und Strings auch Konstrukteure habenBoolean
,Number
undString
jeweils die ihre jeweiligen Primitiven wickeln zusätzliche Funktionen bereitzustellen:Wie Sie sehen können , wenn primitive Werte innerhalb der umhüllte sind
Boolean
,Number
undString
Konstrukteuren bzw. werden sie Objekte. Derinstanceof
Operator arbeitet nur für Objekte (weshalb erfalse
für primitive Werte zurückgibt ):Wie Sie beide sehen können
typeof
undinstanceof
nicht ausreichen, um zu testen, ob ein Wert ein Boolescher Wert, eine Zahl oder eine Zeichenfolge ist,typeof
funktioniert dies nur für primitive Boolesche Werte, Zahlen und Zeichenfolgen. undinstanceof
funktioniert nicht für primitive Boolesche Werte, Zahlen und Zeichenfolgen.Glücklicherweise gibt es eine einfache Lösung für dieses Problem. Die Standardimplementierung von
toString
(dh wie sie nativ definiert istObject.prototype.toString
) gibt die interne[[Class]]
Eigenschaft von primitiven Werten und Objekten zurück:Die interne
[[Class]]
Eigenschaft eines Werts ist viel nützlicher alstypeof
der Wert. Wir können verwendenObject.prototype.toString
, um unsere eigene (nützlichere) Version destypeof
Operators wie folgt zu erstellen :Hoffe dieser Artikel hat geholfen. Um mehr über die Unterschiede zwischen Grundelementen und umschlossenen Objekten zu erfahren, lesen Sie den folgenden Blog-Beitrag: Das geheime Leben von JavaScript-Grundelementen
quelle
null
ist auch ein primitiver Wert (nur dertypeof
Operator ist verwirrend)Sie können die Konstruktoreigenschaft verwenden:
quelle
String
undBoolean
in dem obigen Beispiel, wenn Sie also die Prüfung sindconstructor
Eigenschaft eines String - Variable in einem anderen Fenster erstellt (wie ein Popup oder Rahmen) wird es nicht einfach gleich seinString
, wird es gleich seinthatOtherWindowsName.String
.Object.prototype.toString.call('foo') === '[object String]'
d.constructor == String
? ZB mit einem losen Gleichheitsoperator.Sie können dies verwenden, es wird für beide Fälle als funktionieren
var text="foo";
// typeof wird funktionierenString text= new String("foo");
// instanceof wird funktionierenquelle
Dies ist in der ECMAScript-Spezifikation in Abschnitt 7.3.19 definiert. Schritt 3 :
If Type(O) is not Object, return false.
Mit anderen Worten, wenn das
Obj
InObj instanceof Callable
kein Objekt ist,instanceof
wird dasfalse
direkt kurzgeschlossen .quelle
Ich glaube, ich habe eine tragfähige Lösung gefunden:
quelle
https://www.npmjs.com/package/typeof
Gibt eine Zeichenfolgendarstellung von
instanceof
(dem Konstruktornamen) zurück.quelle
Für mich die Verwirrung verursacht durch
Also
"str" istanceof String
sollte zurückkehren,true
denn wie istanceof wie folgt funktioniert:Die Ergebnisse von Ausdruck Nr. 1 und Nr. 2 stehen in Konflikt miteinander, daher sollte einer von ihnen falsch sein.
# 1 ist falsch
Ich finde heraus, dass es durch die
__proto__
nicht standardmäßige Eigenschaft verursacht wird. Verwenden Sie also die Standardeigenschaft:Object.getPrototypeOf
Jetzt gibt es keine Verwechslung zwischen Ausdruck 2 und 3
quelle
Object("str").__proto__
oderObject("str") instanceof String
.Oder Sie können einfach Ihre eigene Funktion wie folgt erstellen:
Verwendung:
Diese sollten beide true zurückgeben.
quelle