"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
Los literales de matriz y los literales de objeto coinciden ...
[0,1] instanceof Array //=> true
{0:1} instanceof Object //=> true
¿Por qué no todos ellos? O, ¿por qué no todos ellos no ?
¿Y de qué son una instancia, entonces?
Es lo mismo en FF3, IE7, Opera y Chrome. Entonces, al menos es consistente.
Perdí algunas.
12.21 instanceof Number //=> false
/foo/ instanceof RegExp //=> true
fuente
(new String()).valueOf();
typeof foo === 'string'
no es suficiente: vea la respuesta de axkibe.typeof new String('')
regresa"object"
Yo suelo:
Porque en JavaScript las cadenas pueden ser literales u objetos.
fuente
function isString(s) { return s.constructor === String; }
Funciona para literales y objetos de cadena (al menos en V8)typeof
.En JavaScript todo es un objeto (o al menos puede tratarse como un objeto), excepto las primitivas (booleanos, nulos, números, cadenas y el valor
undefined
(y símbolo en ES6)):Como puede ver, los objetos, las matrices y el valor
null
se consideran objetos (null
es una referencia a un objeto que no existe). Las funciones se distinguen porque son un tipo especial de objetos invocables . Sin embargo, siguen siendo objetos.Por otro lado los literales
true
,0
,""
yundefined
no son objetos. Son valores primitivos en JavaScript. Sin embargo, los booleanos, los números y las cadenas también tienen constructoresBoolean
,Number
yString
respectivamente, que envuelven sus primitivas respectivas para proporcionar una funcionalidad adicional:Como puede ver cuando los valores primitivos se envuelven dentro de
Boolean
,Number
y losString
constructores, respectivamente, se convierten en objetos. Elinstanceof
operador solo funciona para objetos (por lo que devuelvefalse
valores primitivos):Como puede ver ambos
typeof
yinstanceof
no son suficientes para probar si un valor es un valor booleano, un número o una cadena,typeof
solo funciona para booleanos, números y cadenas primitivos; yinstanceof
no funciona para booleanos, números y cadenas primitivos.Afortunadamente, hay una solución simple para este problema. La implementación predeterminada de
toString
(es decir, como se define de forma nativaObject.prototype.toString
) devuelve la[[Class]]
propiedad interna de los valores y objetos primitivos:La
[[Class]]
propiedad interna de un valor es mucho más útil quetypeof
el valor. Podemos usarObject.prototype.toString
para crear nuestra propia versión (más útil) deltypeof
operador de la siguiente manera:Espero que este artículo haya ayudado. Para saber más sobre las diferencias entre los primitivos y los objetos envueltos, lea la siguiente publicación de blog: La vida secreta de los primitivos de JavaScript
fuente
null
es un valor primitivo (solo eltypeof
operador es confuso)Puede usar la propiedad constructor:
fuente
String
yBoolean
en el ejemplo anterior, por lo que si está probando laconstructor
propiedad de una variable de cadena creada en otra ventana (como una ventana emergente o un marco), no será igual a simplementeString
, será ser igualthatOtherWindowsName.String
.Object.prototype.toString.call('foo') === '[object String]'
d.constructor == String
? Por ejemplo, con un operador de igualdad suelto.puede usar esto, funcionará tanto para el caso como
var text="foo";
// typeof funcionaráString text= new String("foo");
// instanceof funcionaráfuente
Esto se define en la sección 7.3.19 de la especificación ECMAScript Paso 3 :
If Type(O) is not Object, return false.
En otras palabras, si el
Obj
enObj instanceof Callable
no es un objeto, lainstanceof
voluntad de corto circuito parafalse
directamente.fuente
Creo que se me ocurrió una solución viable:
fuente
https://www.npmjs.com/package/typeof
Devuelve una representación de cadena de
instanceof
(el nombre del constructor)fuente
Para mí la confusión causada por
Por
"str" istanceof String
lo tanto, debe regresartrue
porque cómo istanceof funciona como a continuación:Los resultados de las expresiones n . ° 1 y n . ° 2 entran en conflicto, por lo que debería haber uno de ellos incorrecto.
# 1 está mal
Me doy cuenta de que es causado por la
__proto__
propiedad no estándar, así que use la estándar:Object.getPrototypeOf
Ahora no hay confusión entre la expresión # 2 y # 3
fuente
Object("str").__proto__
oObject("str") instanceof String
.O simplemente puede hacer su propia función de esta manera:
uso:
Ambos deberían volver verdadero.
fuente