O JavaScript, embora considerado uma Toy Language, possui uma série de detalhes que nem todos conhecem. Um deles está no modo como a função String#replace funciona.

O modo mais simples de usá-la é passando uma expressão regular e uma string que será usada na substituição.

string = "2 hours from now";
string.replace(/2/, "3");
// "3 hours from now"

Você também pode utilizar grupos na substituição.

string = "<strong>JavaScript</strong>";
string.replace(/<([^>]+)>(.*?)<\/\1>/, "$2");
// "JavaScript"

Às vezes, queremos fazer alguma operação matemática com algum número. E é aí que entra um "truque" que nem todos conhecem. A função String#replace permite passar uma função, cujo retorno será usado na substituição.

string = "1 + 1 = ?";
string.replace(/(\d+) \+ (\d+) = \?/, function(expression, n1, n2){
  return n1 + " + " + n2 + " = " + (parseInt(n1, 10) + parseInt(n2, 10));
});
// 1 + 1 = 2

Esta é uma funcionalidade desconhecida, mas que pode facilitar muito a sua vida em alguns casos.

Comentários #

#1 PotHix disse:
19 Jan 11, 09:40PM

Æ!!

Que legal, não conhecia esse esquema de passar uma função como argumento!
Boa!

Há braços

#2 Willian Fernandes disse:
20 Jan 11, 05:11AM

De nada pela idéia do post! :)
Zuera...
Essa solução me ajudou muito a replicar, dinamicamente, campos nested em um formulário Rails...

Valeu!

#3 Diego Oliveira disse:
21 Jan 11, 08:49AM

Interessante essa função de callback passada no argumento. E mais interessante o termo "toy language" que eu não conhecia! :)

#4 Kleber Virgilio Correia disse:
21 Jan 11, 01:53PM

Nunca ia imaginar q era possível passar uma função como parâmetro.

Eu nunca fui afundo no JS...
Meus códigos JS eu sempre uso muito ERs (ñ sei se do jeito correto) em replace e match's... pergunto isso é normal?? Até pq ñ fica um código mto claro.

[]'s

#5 Humberto disse:
28 Jan 11, 01:31PM

...embora considerado uma Toy Language [by whom?][citation needed]

#6 Nando Vieira disse:
29 Jan 11, 01:33AM

Experiência pessoal, muitas pessoas que conheço, diversos posts que já li. Isso só está mudando agora ~ http://bit.ly/hz3xUM

#7 Felipe disse:
08 Fev 11, 02:28AM

Muito interessante, não sabia também que fosse possivel passar uma função como argumento,
bacana o post, sucesso !

#8 Willian Fernandes disse:
05 Mar 11, 02:44PM

Parece que o IE, pelo menos na versão 8 não permite utilizar funções no comando replace...

Deixe um comentário





Não é aceito código HTML: adicione-o no pastie.org ou paste.milk-it.net e poste apenas o link.

Se este é seu primeiro comentário, ele terá que ser aprovado antes de ser exibido.

JavaScript Avançado

O JavaScript é a única linguagem que muitos acreditam saber sem nunca terem parado para realmente aprendê-la. Neste workshop rápido você entenderá de verdade todos os conceitos avançados do JavaScript em 4 horas puramente práticas.

Saiba mais Fechar

Conheça também o HOWTO