2012-06-05 8 views
117

arrancar el intérprete/consola y tratar la comparación¿Por qué ",,," == Array (4) en Javascript?

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

¿Por qué? Al principio pensé que tal vez ya que es posible pensar en ",,," como un conjunto de cuatro caracteres con un '0 \' rebanada de terminación, que podría ser por qué, pero

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

devoluciones 'falso'. ¿Entonces por qué? Sé que es un poco idiosincrásico de pato escribiendo en Javascript, pero es curioso lo que subraya este comportamiento. Obtenido esto del excelente presentation here btw de Zed Shaw.

+14

Pocos idiomas aparte de C usan la terminación cero de una manera visible para el programador. – Joey

+7

Si puedo preguntar, ¿qué llevó a este descubrimiento? – SomeKittens

+1

@SomeKittens Zed Shaw menciona esto explícitamente en el video al que me he vinculado en mi pregunta (como crítica de Javascript). ¡Aclamaciones! – ZenLikeThat

Respuesta

176

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

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

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

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

Cómo la comparación obras se describe en la sección 11.9.3 of the specification . Allí podrá ver (x == y):

8. Si el Tipo ( x) es SERIE o Número y tipo (y) es objeto,
devolver el resultado de la comparación x = = ToPrimitive (y).

(arrays son objetos en JavaScript)

y si se sigue el método ToPrimitive es muy probable que encuentre que se llama toString.

+2

Bien, ahora todo esto tiene sentido para mí. Gracias. – ZenLikeThat

+6

que, a su vez, se debe a que las matrices se stringifican como si estuvieran usando 'Array.join (", ")'. – duskwuff

+3

Gran respuesta, muy precisa. – LoremIpsum

32

Intente utilizar ===. Al usar == en Javascript, intentará emitir las variables, lo que dará lugar a 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.

Véase el siguiente fragmento:

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

31

Internamente su ir

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

Comparación de un arreglo en una cadena coacciona el arreglo en 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.

17

Esto es porque Array(4) inicializa una matriz de 4 valores vacíos, un == convierte implícitamente, por lo que:

",,," == Array(4) 

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

",,," == ["", "", "", ""] // note 3 commas for 4 values 

",,," == ["", "", "", ""].toString() 

son todas similares.

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

4

Al principio pensé que era algo con el "prototipo" ... pero después de un poco de investigación llegué a una triste conclusión ...

Al parecer se trata de una cosa js interna y más oscuro y no hay mucha lógica. ..

Sólo trate

Array(4)==Array(4) 

y sin coacción, tanto por tipos también ...

Array(4)===Array(4) 

y obtendrá FALSO

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

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

+0

ZEE, Array (4) == [,,,] no será cierto. Si comparamos el objeto con la primitiva, entonces el objeto se convertirá en primitivo. Esa es la razón por la que llama a String(). – devsathish

+0

matriz (x) debe ser la dirección del constructor ... de todos modos, en un sistema (no molestar qué tipo de sistema), === siempre será cierto! – ZEE

Cuestiones relacionadas