Diferença nestas 2 Strings (JavaScript)
Eu estava tentando criar variáveis de tipos de dados de string com valores de 2 maneiras.
- Como string literal
- Usando nova palavra-chave
Mas, para mim, parece que os dois são diferentes em representação no console.log . Alguém pode me dizer se a 2ª via não retorna string ou é de alguma forma diferente?
var str1 = "abc";
var str2 = new String("def");
console.log(str1);
console.log(str2);
Esperado:
abc, def
Resultado:
Respostas
JavaScript tem duas categorias principais de tipo, primivites e objetos.
typeof new String(); // "object"
typeof ''; // "string"
Para declarações de atribuição de valores primitivos a uma variável como:
var str1 = "Hi";
JavaScript criará internamente a variável usando:
String("Hi")
Usar a nova palavra-chave funciona de maneira diferente e, em vez disso, retorna um objeto.
Chamar new String(something)cria um objeto de instância String.
Os resultados parecem os mesmos via console.log () porque ele apenas extrairá a string primitiva da instância String que você passar para ela.
Portanto: simplesmente String () retorna uma primitiva de string. new String ('xyz') retorna um objeto construído pelo construtor String.
Raramente é necessário construir explicitamente uma instância de String.
Você está trabalhando com duas coisas diferentes. O var str1 = "abc"dá a você um primitivo. Enquanto o var str2 = new String("def");dá a você um objeto string. Esses dois tipos se comportam de maneira diferente
O objeto String permite trabalhar com uma série de caracteres; ele envolve o tipo de dados primitivo de string de Javascript com vários métodos auxiliares.
Como o JavaScript converte automaticamente entre primitivos de string e objetos String, você pode chamar qualquer um dos métodos auxiliares do objeto String em um primitivo de string.
Quando você imprime um objeto, geralmente o console imprime as propriedades do objeto.
Se for um primitivo o console apenas imprime o valor.
O primitivo não é encaixotado, mas se você criar uma string com um construtor, a string será encaixotada no objeto e sempre terá propriedades.
Se for apenas um literal, ele só terá propriedades quando você acessar a propriedade de uma string com .operador porque ocorre o boxing, mas depois disso, ele continua sendo um literal sem nada adicional adicionado, por isso quando você imprimir "The cat is very grumpy", basta imprimir o valor e nada Mais. literais primitivos nem sempre são objetos com propriedades, são apenas objetos quando estão em caixas.