Iba a comenzar a usar === (triple igual, comparación estricta) todo el tiempo al comparar valores de cadena, pero ahora encuentro que
"foo" === new String("foo")
es falso, y lo mismo con esto:
var f = "foo", g = new String("foo");
f === g; // false
Por supuesto:
f == g; // true
Entonces, ¿se recomienda usar siempre == para la comparación de cadenas, o convertir siempre las variables en cadenas antes de comparar?
javascript
object
equality
Michael Butler
fuente
fuente
foo
es la cadena pura ynew String("foo")
es la cadena del objetonew String
(Completamente inútil) en lugar de usar==
new String("foo")
en Javascript en primer lugar? Nunca he visto tal código en código, es decir, jQuery ...String(obj)
para convertir una cadena en caja a la primitiva una vez que haya recibido su parámetro "cadena".("foo" === String(new String("foo"))) === true
Respuestas:
"foo"
es una cadena primitiva . (este concepto no existe en C # o Java)new String("foo")
es un objeto de cadena en caja.El
===
operador se comporta de manera diferente en primitivas y objetos .Al comparar primitivas (del mismo tipo),
===
devolverá verdadero si ambas tienen el mismo valor.Al comparar objetos,
===
devolverá verdadero solo si se refieren al mismo objeto (comparando por referencia). Por lo tanto,new String("a") !== new String("a")
.En su caso,
===
devuelve falso porque los operandos son de diferentes tipos (uno es un primitivo y el otro es un objeto).Los primitivos no son objetos en absoluto.
El
typeof
operador no regresará"object"
por primitivas.Cuando intentas acceder a una propiedad de una primitiva (usándola como un objeto), el lenguaje Javascript la encajará en un objeto, creando un nuevo objeto cada vez. Esto se describe en la especificación .
Es por eso que no puede asignar propiedades a las primitivas:
Cada vez que escribe
x.property
, se crea un objeto en caja diferenteString
.fuente
typeof "foo"; // "string"
,typeof new String("foo"); // "object"
null
yundefined
.if( Object(a) !== a ) { //it's a primitive }
Usando
===
,un Objeto nunca es igual a nada excepto a otra referencia a sí mismo.
una primitiva es igual en comparación con otra primitiva si su tipo y valor son los mismos.
fuente
new String("foo") === new String("foo")
esfalse
:-PLa
new
palabra es un criminal aquí ( como de costumbre , puedo decir) ...Cuando lo usa
new
, expresa explícitamente su deseo de trabajar con el objeto . Puede que te sorprenda, pero esto:... te dará un poderoso
false
. Es simple: comparados no son el interior de los objetos, sino las referencias de los objetos. Y, por supuesto, no son iguales, ya que se crearon dos objetos diferentes.Lo que probablemente quieras usar es la conversión :
... y eso te dará, como se esperaba,
true
como resultado, para que puedas regocijarte y prosperar con tu igualfoos
para siempre. )fuente
toString()
método, por ejemplo.foo
es la cadena pura ynew String("foo")
es la cadena del objetofuente
Desde el REPL de node.js ("nodo" en la línea de comandos si está instalado):
fuente