"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
Literais de matriz e literais de objeto correspondem ...
[0,1] instanceof Array //=> true
{0:1} instanceof Object //=> true
Por que não todos eles? Ou, por que não todos eles não ?
E, de que são uma instância, então?
É o mesmo no FF3, IE7, Opera e Chrome. Então, pelo menos é consistente.
Perdeu alguns.
12.21 instanceof Number //=> false
/foo/ instanceof RegExp //=> true
javascript
literals
instanceof
Jonathan Lonowski
fonte
fonte
(new String()).valueOf();
typeof foo === 'string'
não é suficiente: veja a resposta do axkibe.typeof new String('')
retornos"object"
Eu uso:
Como no JavaScript, as strings podem ser literais ou objetos.
fonte
function isString(s) { return s.constructor === String; }
Trabalha para literais e objetos string (pelo menos em V8)typeof
.Em JavaScript, tudo é um objeto (ou pelo menos pode ser tratado como um objeto), exceto primitivas (booleanos, nulos, números, seqüências de caracteres e o valor
undefined
(e símbolo no ES6)):Como você pode ver objetos, matrizes e o valor
null
são todos considerados objetos (null
é uma referência a um objeto que não existe). As funções são diferenciadas porque são um tipo especial de objetos que podem ser chamados . No entanto, eles ainda são objetos.Por outro lado, os literais
true
,0
,""
eundefined
não são objetos. Eles são valores primitivos em JavaScript. No entanto, booleanos, números e seqüências de caracteres também têm construtores eBoolean
, respectivamente, que agrupam suas respectivas primitivas para fornecer funcionalidade adicional:Number
String
Como você pode ver quando os valores primitivos são agrupados nos construtores
Boolean
,Number
eString
respectivamente eles se tornam objetos. Oinstanceof
operador trabalha apenas para objetos (é por isso que retornafalse
para valores primitivos):Como você pode ver os dois
typeof
einstanceof
é insuficiente para testar se um valor é um booleano, um número ou uma string -typeof
funciona apenas para booleanos primitivos, números e strings; einstanceof
não funciona para booleanos primitivos, números e seqüências de caracteres.Felizmente, existe uma solução simples para esse problema. A implementação padrão de
toString
(ou seja, como é definida originalmenteObject.prototype.toString
) retorna a[[Class]]
propriedade interna dos valores e objetos primitivos:A
[[Class]]
propriedade interna de um valor é muito mais útil quetypeof
o valor. Podemos usarObject.prototype.toString
para criar nossa própria versão (mais útil) dotypeof
operador da seguinte maneira:Espero que este artigo tenha ajudado. Para saber mais sobre as diferenças entre objetos primitivos e agrupados, leia a seguinte postagem no blog: A Vida Secreta das Primitivas JavaScript
fonte
null
é um valor primitivo , bem como (apenas otypeof
operador é confuso)Você pode usar a propriedade construtor:
fonte
String
eBoolean
no exemplo acima, portanto, se você estiver testando aconstructor
propriedade de uma variável de string criada em outra janela (como um pop-up ou quadro), ela não será igual a simplesmenteString
, será seja igual athatOtherWindowsName.String
.Object.prototype.toString.call('foo') === '[object String]'
d.constructor == String
? Por exemplo, com um operador de igualdade frouxo.você pode usar isso, ele funcionará nos dois casos
var text="foo";
// typeof funcionaráString text= new String("foo");
// instanceof funcionaráfonte
Isso é definido na seção 7.3.19 da especificação ECMAScript, etapa 3 :
If Type(O) is not Object, return false.
Em outras palavras, se o
Obj
inObj instanceof Callable
não for um objeto, oinstanceof
curto-circuito seráfalse
diretamente.fonte
Acredito ter encontrado uma solução viável:
fonte
https://www.npmjs.com/package/typeof
Retorna uma representação de string de
instanceof
(o nome dos construtores)fonte
Para mim, a confusão causada por
Então,
"str" istanceof String
deve retornartrue
porque como istanceof funciona como abaixo:Os resultados das expressões # 1 e # 2 conflitam entre si; portanto, deve haver um deles errado.
# 1 está errado
Descobri que ele é causado pela
__proto__
propriedade não padrão, então use o padrão:Object.getPrototypeOf
Agora não há confusão entre as expressões 2 e 3
fonte
Object("str").__proto__
ouObject("str") instanceof String
.Ou você pode simplesmente fazer sua própria função assim:
uso:
Ambos devem retornar verdadeiro.
fonte