Há uma diferença fundamental em JavaScript entre os primitivos valores (indefinidos, nulos, booleanos, números e strings) e objetos (incluindo matrizes e funções). Os primitivos são imutáveis: não há como alterar (ou “transformar”) um valor primitivo. Isso é óbvio para números e booleanos - nem mesmo faz sentido mudar o valor de um número. Não é tão óbvio para strings, entretanto. Uma vez que as strings são como arrays de caracteres, você pode esperar ser capaz para alterar o caractere em qualquer índice especificado. Na verdade, JavaScript não permite isso e todos os métodos de string que parecem retornar uma string modificada estão, na verdade, retornando um novo valor de string. Por exemplo:
Os primitivos também são comparados por valor: dois valores são iguais apenas se eles têm o mesmo valor. Isso soa redundante para números, booleanos, nulo e indefinido: não há outra maneira que eles possam ser comparados. Novamente, entretanto, não é tão óbvio para as strings. Se dois valores de string distintos são comparados, JavaScript os trata como iguais se, e somente se, eles têm o mesmo comprimento e se o caractere em cada índice o mesmo.
Os objetos são diferentes dos primitivos. Primeiro, eles são mutáveis - os seus valores podem mudar:
Objetos não são comparados por valor: dois objetos distintos não são iguais mesmo que tenham as mesmas propriedades e valores. E dois arrays distintos não são iguais, mesmo que tenham os mesmos elementos no mesmo pedido:
Os objetos às vezes são chamados de tipos de referência para distingui-los de Tipos primitivos do JavaScript. Usando esta terminologia, os valores dos objetos são referências, e dizemos que os objetos são comparados por referência: pois os valores dos objetos são os mesmos se e somente se eles se referem ao mesmo objeto subjacente.
Como você pode ver neste código, atribuir um objeto (ou array) a um variável simplesmente atribui a referência: não cria uma nova cópia de o objeto. Se você quiser fazer uma nova cópia de um objeto ou array, você deve copiar explicitamente as propriedades do objeto ou os elementos da variável.
Da mesma forma, se quisermos comparar dois objetos ou matrizes distintas, deve comparar suas propriedades ou elementos. Este código define uma função para comparar dois arrays: