Inicialize seu intérprete / console e tente a comparação
> ",,," == Array(4)
True
Por quê? No começo, pensei que talvez você pudesse pensar em ",,," como uma matriz de quatro caracteres com uma fatia de terminação '\ 0', talvez por isso, mas
> "..." == Array(4)
Retorna "Falso". Então por que? Eu sei que é um pouco idiossincrático de digitação de pato em Javascript, mas apenas curioso o que sublinha esse comportamento. Recolheu isso da excelente apresentação de Zed Shaw aqui .
javascript
ZenLikeThat
fonte
fonte
===
vez de==
.Respostas:
Como o operando do lado direito é convertido em uma string e a representação da string
Array(4)
é,,,
:Se você usar a função construtora da matriz e passar um número, ela definirá o comprimento da matriz para esse número. Portanto, você pode dizer que possui quatro índices vazios (o mesmo que
[,,,]
) e a representação de string padrão de matrizes é uma lista separada por vírgula de seus elementos:Como a comparação funciona é descrito na seção 11.9.3 da especificação . Lá você verá (
x == y
):(matrizes são objetos em JavaScript)
e se você seguir o
ToPrimitive
método, acabará descobrindo que ele chamatoString
.fonte
Array.join(",")
.Internamente está indo
fonte
Tente usar
===
. Ao usar==
em Javascript, ele tentará converter as variáveis, levando a problemas como este. O console está transmitindoArray(4)
para a representação de sequência (ou sejaArray(4).toString
), que é",,,"
. O motivo das vírgulas existirem é que a.toString()
função as adiciona aos itens separados em uma matriz.Veja o trecho abaixo:
fonte
Isso ocorre porque
Array(4)
inicializa uma matriz de 4 valores vazios, um==
converte implicitamente, portanto:São todos semelhantes.
==
faz conversões implícitas de tipo antes de comparar os valores, o que pode resultar em resultados imprevisíveis. Use===
para verificar o tipo e o valor.fonte
A comparação de uma matriz com uma cadeia de caracteres força a matriz a uma cadeia de caracteres antes de fazer a comparação. Coagir uma matriz de 4 elementos vazia a uma sequência produz a sequência exata.
fonte
Eu primeiro pensei que era algo com o "protótipo" ... mas depois de um pouco de investigação cheguei a uma conclusão triste ...
Aparentemente, é uma coisa js interna e mais obscura, com pouca lógica ...
Apenas tente
e sem coerção sobre os tipos também ...
e você terá FALSE
você sabe disso
null==null
,null===null
e atéundefined==undefined
eundefined===undefined
retorna VERDADEIRO ... então ... é um pouco obscuro ...Array(4)==[,,,]
deve ser verdade tambémfonte