Durante o processo de aplicação JavaScript, encontraremos várias comparações. Hoje, compilei três situações para você e as aprendi juntas.
1. Comparação de dois objetos
As comparações de JavaScript são misturadas com alguns recursos estranhos, vamos dar uma olhada em algumas comparações simples.
// Comparação de valores brutos> var a = 12UNDefined> var b = 12ndefined> a == bTrue> a === bTrue // Comparação de objetos> var c = [] indefinido> var d = []
A partir dos resultados acima, podemos ver que comparar dois valores originais parece ser um pouco diferente de comparar objetos. Se você comparar os valores de dois objetos, mesmo que seus valores sejam iguais, o resultado final será diferente. Ao comparar dois objetos, as referências dos dois objetos devem ser comparadas.
Se fizermos isso:
> var m = {} indefinido> n = m {}> n === MTRUEIsso significa que ambas as variáveis apontam para o mesmo objeto, por isso são iguais.
2. Comparação de diferentes tipos
Há também a seguinte situação especial
> 12 == "12" Verdadeiro> NULL == UndefinedTrue> Undefined == Falsefalse> NULL == FALSEFALSE> NULL === UndefinedFalse
Por que os números inteiros podem ser iguais a cordas? Isso ocorre porque == (igual a, não congruente) não compara os tipos. Antes de comparar, ele digitará os valores que precisam ser comparados. Aqui, a string será convertida em tipos numéricos e depois comparada . Por que é tão certo? Vamos fazer alguns experimentos.
> 1 + 23> 1 + "2" '12'> 2 <"12" true> "2" <"12" false
A partir do exemplo acima, podemos ver que o valor 2 é realmente menor que a string 12. Se a comparação foi convertida em uma string antes que o valor fosse convertido em uma string, o resultado deve ser "2"> "12".
Não acredita ainda? Deixe -me dar outro exemplo.
> "12d"> 12false> "12d" <12false> "12d" == 12false> "12" <"12d" true
Por que isso? Se você converter 12 em uma corda, 12D deve ser maior que 12, certo? Por que você compara com FALSE? Eu acho que é por causa do cara especial abaixo.
> Nan <1false> nan> 1false
Não importa o que a NAN se comparar, ele retornará falsa. Inclusive a si mesmo. Portanto, a melhor maneira de determinar se uma variável é nan é x! = X se o retorno true, significa que x é nan . Então aqui deve ser quando 12D deve ser convertido em um tipo numérico, porque possui caracteres especiais e finalmente se torna NAN. Não importa como você o compare com o tipo numérico, o resultado é falso.
Para operadores numéricos e de sequência, o operador de sinal de mais se comporta de maneira diferente do operador de comparação. O operador Plus prefere strings e, se um dos operandos for uma string, será convertido em uma string. Os operadores de comparação preferem números, e as comparações de string serão realizadas apenas quando ambos os números forem strings.
Quanto ao nulo e indefinido acima. . . . . Não sei como explicar o comportamento deles por enquanto. Só me lembro por enquanto. Porque eles são especiais.
3. Comparação de objetos com valores originais
Se dois objetos que precisam ser comparados são objetos e esqueletos JavaScript, um certo grau de conversão de tipo será realizado. Encontre uma maneira de converter o valor do objeto no valor original. De um modo geral, existem dois métodos valueOf, toString . A seguir, o processo de conversão de um objeto vazio:
// escrevi diretamente> a = {} {} // 1. Valueof Conversão> a.Valueof () {} // 2. Se a operação acima resultar em um valor bruto, use a tostring para converter. (E vice -versa)> a.toString () '[objeto objeto]'> a == '[objeto objeto]' true O exposto acima é na verdade um processo de conversão de objetos embutido e um mecanismo de JavaScript. Primeiro, ele chamará valueOf para conversão. Se o valor obtido não for um valor primitivo, ele chamará toString para conversão. O valor final é '[object Object]' um valor muito estranho, mas é o valor original. Se a variável A e esse valor forem iguais (não congruentes), um resultado verdadeiro poderá ser obtido. (Isso entrou em colapso?)
No entanto, o guia autoritário fornece os seguintes princípios, podemos nos referir a ele.
Converter valores brutos O núcleo de idioma JavaScript, as classes integradas, primeiro tente converter com ValueO F e, em seguida, use toString para conversão. Exceto pela classe de data, ele usa apenas toString para conversão. Os objetos que não estão no núcleo do JavaScript são convertidos em valores originais pela maneira como são definidos em suas respectivas implementações.
De acordo com a explicação acima. Quando comparamos A = {} com o valor original, chamaremos a função valueOf primeiro e o resultado é que {} obviamente não é um valor primitivo. Em seguida, a conversão será executada usando toString . Finalmente, esse resultado estranho saiu. Mas esse resultado estranho '[object Object]' é realmente o valor original de {}. (É o literal de uma corda).
O exposto acima é um resumo comparativo no JavaScript. Espero que a descrição deste artigo seja útil para todos ao aprender JavaScript.