Olá, Gordos, tudo bem?

Bem, as vezes eu recebo a seguinte pergunta:

Por que acessamos, em JavaScript, métodos como split() e substring() nas strings se elas não são objetos? Isso ficaria “claro” de identificar se fosse um objeto mesmo, não?

var OGordo = {
	nossasComidas: function(){
		var comidas = ["David: lasanha/massas", "Junior: macarronada", "Thiago: lasanha/pizza"];
		alert(comidas[Math.round(Math.random() * (comidas.length - 1))])
	}
};
OGordo.nossasComidas();

Com este mesmo exemplo, observe a última linha. Veja que é chamado o método nossasComidas() no objeto OGordo. Certo? Agora me diz uma coisa com base no seguinte código:

var OGordo = "OGordo.com";
var first_part = OGordo.split(".")[0];

O que a variável first_part recebe? Ela recebe um objeto OGordo com um método split()? NÃO! Ela recebe um string com o método split()!

Ué… Mas string pode ser manipulada usando notação de objeto? NÃO!

O que acontece é que para cada valor primitivo de dados, ou seja, tipos númericos, string e booleano, o JavaScript tem uma classe de objeto correspondente. Então além de suportar aqueles tipos de dados primitivos, ele também suporta as classes Number, String e Boolean. Essas classes são empacotadoras dos tipos primitivos.

Um empacotador põe produtos na sacola de supermercado possui o mesmo valor dos seus respectivos dados primitivos, com a diferença que ele define métodos e propriedades que usamos para manipular esses dados.

Na prática: JavaScript consegue converter de forma flexível os valores de um tipo para outro. Quando nós usamos uma string em contexto de objeto, ou seja, acessamos propriedades e métodos deste, JavaScript cria internamente o objeto empacotador String. Como um objeto tem propriedades e métodos, é através dele que JavaScript faz o que está sendo pedido.

Voltando ao exemplo:

var OGordo = "OGordo.com";
var first_part = OGordo.split(".")[0];

Na primeira linha nós criamos a variável que é um string. Na segunda linha criamos outra variável, e ela recebe um objeto empacotador String – lembrado que esse objeto é transitório, ou seja, só vai servir para aquele momento e depois o objeto é descartado – com o método split().

Só para terminar:
Também podemos criar um objeto String. Eles são criados do mesmo jeito que os outros objetos, ou seja, com o operador new:

var OGordo = new String("OGordo.com");
var first_part = OGordo.split(".")[0];
// Ficou na dúvida se é ou não objeto? Tire-a com o typeof alert(typeof(OGordo));

Tudo o que o string pode fazer, o String também faz.

E legal saber que o objeto String também pode ser convertido para um tipo dado primitivo. Isso acontece sempre que usamos um objeto String que espera um tipo de dado primitivo. Exemplo:

var OGordo = new String("OGordo");
var resto = ".com";
OGordo += resto;

Só lembrado que tudo acima se aplica aos outros tipos primitivos de dados, mas não o usamos com a mesma freqüência que a string.

É isso aí pessoal. Dúvidas, sugestões, errata, etc. comentem. ;)

Abraços.

P.S.: É incrível como gordos gostam de massas. ^^