"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
nullse consideran objetos (nulles 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,""yundefinedno son objetos. Son valores primitivos en JavaScript. Sin embargo, los booleanos, los números y las cadenas también tienen constructoresBoolean,NumberyStringrespectivamente, que envuelven sus primitivas respectivas para proporcionar una funcionalidad adicional:Como puede ver cuando los valores primitivos se envuelven dentro de
Boolean,Numbery losStringconstructores, respectivamente, se convierten en objetos. Elinstanceofoperador solo funciona para objetos (por lo que devuelvefalsevalores primitivos):Como puede ver ambos
typeofyinstanceofno son suficientes para probar si un valor es un valor booleano, un número o una cadena,typeofsolo funciona para booleanos, números y cadenas primitivos; yinstanceofno 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 quetypeofel valor. Podemos usarObject.prototype.toStringpara crear nuestra propia versión (más útil) deltypeofoperador 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
nulles un valor primitivo (solo eltypeofoperador es confuso)Puede usar la propiedad constructor:
fuente
StringyBooleanen el ejemplo anterior, por lo que si está probando laconstructorpropiedad 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
ObjenObj instanceof Callableno es un objeto, lainstanceofvoluntad de corto circuito parafalsedirectamente.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 Stringlo tanto, debe regresartrueporque 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.getPrototypeOfAhora 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