"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
Les littéraux de tableau et les littéraux d'objet correspondent ...
[0,1] instanceof Array //=> true
{0:1} instanceof Object //=> true
Pourquoi pas tous? Ou, pourquoi ne pas tous pas ?
Et de quoi sont-ils un exemple, alors?
C'est la même chose dans FF3, IE7, Opera et Chrome. Donc, au moins, c'est cohérent.
En a manqué quelques-uns.
12.21 instanceof Number //=> false
/foo/ instanceof RegExp //=> true
la source
(new String()).valueOf();
typeof foo === 'string'
ne suffit pas: voir la réponse d'Axkibe.typeof new String('')
retours"object"
J'utilise:
Parce qu'en JavaScript, les chaînes peuvent être des littéraux ou des objets.
la source
function isString(s) { return s.constructor === String; }
Fonctionne pour les littéraux et les objets chaîne (au moins en V8)typeof
.En JavaScript, tout est un objet (ou peut au moins être traité comme un objet), à l'exception des primitives (booléens, null, nombres, chaînes et la valeur
undefined
(et le symbole dans ES6)):Comme vous pouvez le voir, les tableaux et la valeur
null
sont tous considérés comme des objets (null
c'est une référence à un objet qui n'existe pas). Les fonctions se distinguent parce qu'elles sont un type spécial d' objets appelables . Mais ce sont toujours des objets.D'autre part , les littéraux
true
,0
,""
etundefined
ne sont pas des objets. Ce sont des valeurs primitives en JavaScript. Cependant, les booléens, les nombres et les chaînes ont également des constructeursBoolean
,Number
etString
respectivement qui enveloppent leurs primitives respectives pour fournir des fonctionnalités supplémentaires:Comme vous pouvez le voir lorsque les valeurs primitives sont enveloppées respectivement dans les constructeurs et
Boolean
, elles deviennent des objets. L' opérateur ne fonctionne que pour les objets (c'est pourquoi il retourne pour les valeurs primitives):Number
String
instanceof
false
Comme vous pouvez voir les deux
typeof
etinstanceof
sont insuffisants pour tester si une valeur est un booléen, un nombre ou une chaîne -typeof
ne fonctionne que pour les booléens primitifs, les nombres et les chaînes; etinstanceof
ne fonctionne pas pour les booléens primitifs, les nombres et les chaînes.Heureusement, il existe une solution simple à ce problème. L'implémentation par défaut de
toString
(c'est-à-dire telle qu'elle est définie de manière native surObject.prototype.toString
) renvoie la[[Class]]
propriété interne des valeurs primitives et des objets:La
[[Class]]
propriété interne d'une valeur est beaucoup plus utile quetypeof
la valeur. Nous pouvons utiliserObject.prototype.toString
pour créer notre propre version (plus utile) de l'typeof
opérateur comme suit:J'espère que cet article vous a aidé. Pour en savoir plus sur les différences entre les primitives et les objets encapsulés, lisez le billet de blog suivant: La vie secrète des primitives JavaScript
la source
null
est également une valeur primitive (seul l'typeof
opérateur est déroutant)Vous pouvez utiliser la propriété constructeur:
la source
String
etBoolean
dans l'exemple ci-dessus, donc si vous testez laconstructor
propriété d'une variable de chaîne créée dans une autre fenêtre (comme un popup ou un cadre), elle ne sera pas simplement égaleString
, elle être égal àthatOtherWindowsName.String
.Object.prototype.toString.call('foo') === '[object String]'
d.constructor == String
? Par exemple, avec un opérateur d'égalité lâche.vous pouvez l'utiliser, cela fonctionnera dans les deux cas comme
var text="foo";
// typeof fonctionneraString text= new String("foo");
// instanceof fonctionnerala source
Ceci est défini dans la spécification ECMAScript Section 7.3.19 Étape 3 :
If Type(O) is not Object, return false.
En d'autres termes, si l'
Obj
entréeObj instanceof Callable
n'est pas un objet, lainstanceof
volonté court-circuiterafalse
directement.la source
Je pense avoir trouvé une solution viable:
la source
https://www.npmjs.com/package/typeof
Renvoie une représentation sous forme de chaîne de
instanceof
(le nom du constructeur)la source
Pour moi, la confusion causée par
Donc
"str" istanceof String
devrait revenirtrue
parce que comment fonctionne istanceof comme ci-dessous:Les résultats des expressions # 1 et # 2 sont en conflit, donc l'un d'eux devrait être faux.
# 1 est faux
Je pense que cela est dû à la
__proto__
propriété non standard, alors utilisez celle standard:Object.getPrototypeOf
Maintenant, il n'y a plus de confusion entre l'expression # 2 et # 3
la source
Object("str").__proto__
ouObject("str") instanceof String
.Ou vous pouvez simplement créer votre propre fonction comme ceci:
usage:
Celles-ci devraient toutes les deux retourner vrai.
la source