repetidos objetos objects elementos elemento contar buscar array javascript

objetos - foreach javascript



¿Por qué ",,,"== Array(4) en Javascript? (6)

Arranque su intérprete / consola y pruebe la comparación

> ",,," == Array(4) True

¿Por qué? Al principio pensé que quizás ya que se podía pensar en ",,," como una matriz de cuatro caracteres con un segmento de terminación ''/ 0'', esa podría ser la razón, pero

> "..." == Array(4)

Devuelve "Falso". ¿Entonces por qué? Sé que es un poco idiosincrásico de pato escribiendo en Javascript, pero es curioso lo que subraya este comportamiento. Obtuve esto de la excelente presentación de Zed Shaw aquí por cierto .


Al comparar una matriz con una cadena, se fuerza la matriz a una cadena antes de hacer la comparación. La coerción de una matriz vacía de 4 elementos a una cadena produce esa cadena exacta.


Esto se debe a que Array(4) inicializa una matriz de 4 valores vacíos, an == convierte implícitamente, por lo que:

",,," == Array(4) ",,," == Array(4).toString() ",,," == ["", "", "", ""] // note 3 commas for 4 values ",,," == ["", "", "", ""].toString()

Son todos similares

== realiza conversiones de tipo implícito antes de comparar los valores, lo que puede generar resultados impredecibles. Use === para verificar el tipo y el valor.


Intenta usar === . Al usar == en Javascript, intentará lanzar las variables, lo que generará problemas como este. La consola está emitiendo Array(4) a la representación de cadena (es decir, Array(4).toString ), que es ",,," . La razón por la que las comas están ahí es que la función .toString() las agrega a elementos separados en una matriz.

Vea el fragmento a continuación:

document.write( Array(4).toString() );


Internamente va

",,," == Array(4).toString()


Porque el operando de la mano derecha se convierte en una cadena y la representación de cadena de Array(4) es ,,, :

> Array(4).toString() ",,,"

Si utiliza la función de constructor de matriz y pasa un número, establece la longitud de la matriz a ese número. Por lo tanto, puede decir que tiene cuatro índices vacíos (lo mismo que [,,,] ) y la representación de cadena por defecto de las matrices es una lista de sus elementos separados por comas:

> [''a'',''b'',''c''].toString() "a,b,c"

Cómo funciona la comparación se describe en la sección 11.9.3 de la especificación . Ahí verá ( x == y ):

8. Si Tipo ( x ) es Cadena o Número y Tipo ( y ) es Objeto,
devuelve el resultado de la comparación x == ToPrimitive ( y ).

(las matrices son objetos en JavaScript)

y si sigue el método ToPrimitive eventualmente encontrará que llama a toString .


Primero pensé que era algo con el "prototipo" ... pero después de una pequeña investigación llegué a una triste conclusión ...

Aparentemente es una cosa interna y más oscura, sin mucha lógica ...

Sólo inténtalo

Array(4)==Array(4)

y ninguna coerción en los tipos también ...

Array(4)===Array(4)

y obtendrás FALSO

usted sabe que null==null , null===null e incluso undefined==undefined y undefined===undefined devuelve TRUE ... así que ... es un poco oscuro ...

Array(4)==[,,,] debería ser cierto también