Eu ia começar a usar === (triplo igual, comparação estrita) o tempo todo ao comparar valores de string, mas agora acho que
"foo" === new String("foo")
é falso e o mesmo com este:
var f = "foo", g = new String("foo");
f === g; // false
Claro:
f == g; // true
Portanto, é recomendado sempre usar == para comparação de strings ou sempre converter variáveis em strings antes de comparar?
javascript
object
equality
Michael Butler
fonte
fonte
foo
seja a string pura enew String("foo")
seja a String Objectnew String
(Completamente inútil) em vez de usar==
new String("foo")
em Javascript em primeiro lugar? Nunca vi esse código em código, ou seja, jQuery ...String(obj)
para converter uma string em caixa para a primitiva assim que receber o parâmetro "string".("foo" === String(new String("foo"))) === true
Respostas:
"foo"
é uma string primitiva . (este conceito não existe em C # ou Java)new String("foo")
é um objeto de string em caixa.O
===
operador se comporta de maneira diferente em primitivos e objetos .Ao comparar primitivas (do mesmo tipo),
===
retornará verdadeiro se ambas tiverem o mesmo valor.Ao comparar objetos,
===
retornará verdadeiro somente se eles se referirem ao mesmo objeto (comparação por referência). Assimnew String("a") !== new String("a")
,.No seu caso,
===
retorna falso porque os operandos são de tipos diferentes (um é primitivo e o outro é um objeto).Os primitivos não são objetos de forma alguma.
O
typeof
operador não retornará"object"
para primitivas.Quando você tenta acessar uma propriedade de um primitivo (usando-o como um objeto), a linguagem Javascript irá encaixotá-lo em um objeto, criando um novo objeto a cada vez. Isso é descrito na especificação .
É por isso que você não pode colocar propriedades em primitivos:
Cada vez que você escreve
x.property
, um objeto de caixa diferenteString
é criado.fonte
typeof "foo"; // "string"
,typeof new String("foo"); // "object"
null
eundefined
.if( Object(a) !== a ) { //it's a primitive }
Usando
===
,um objeto nunca é igual a nada, exceto outra referência a si mesmo.
uma primitiva é igual quando comparada a outra primitiva se seu tipo e valor forem iguais.
fonte
new String("foo") === new String("foo")
éfalse
:-PA
new
palavra é criminosa aqui ( como sempre , posso dizer) ...Ao usar
new
, você expressa explicitamente seu desejo de trabalhar com objeto . Pode ser surpreendente para você, mas isso:... lhe dará um poderoso
false
. É simples: comparados não são os interiores dos objetos, mas as referências dos objetos. E eles, é claro, não são iguais, pois dois objetos diferentes foram criados.O que você provavelmente deseja usar é a conversão :
... e isso lhe dará, como esperado,
true
como resultado, para que você possa se alegrar e prosperar com seu igualfoos
para sempre. )fonte
toString()
método, por exemplo.foo
é a string pura enew String("foo")
é a String do objetofonte
No REPL node.js ("node" na linha de comando, se instalado):
fonte