2010-07-12

Una pequeña delicia del JavaScript

Qué valor debería dar el siguiente código:

"aDb".replace("D","$$")

Si pensaron "a$$b" se equivocaron. Da "a$b" (con un solo $).
Para que de el valor que esperaba ("a$$b") hay que hacer este hack:
"aDb".replace("D",function() { return "$$" })

¿Por qué?
Ni idea, pero anda así en rhino y V8, así que debe estar en la especificación.

Happy hacking,
Aureliano

5 comentarios:

Luis dijo...

Hola
Como la cadena que uno busca en el replace puede ser un regexp, el reemplazo puede ser alguno de los grupos que se capturaron (si hubo alguno) u otros valores relacionados con la busqueda. Y todas se referencian con $ al principio, por lo que el $$ es la manera de insertar un '$'

http://www.regular-expressions.info/javascript.html

aurelianito dijo...

Me imaginé que venía por ese lado. Pero el problema es que en la versión original texto de reemplazo lo ingresa el usuario. Y para eso es este hack en realidad. Para no tener que escapar el texto del usuario antes de usarlo como resultado del replace.

Igual tener que escapar el $ aún cuando no hay regexp es una chotada.

Matias dijo...

Aure no se si lo viste en buzz pero se resuelve un poco mas facil. "aDb".replace("D", "$$$");

aurelianito dijo...

Lo había visto. El problema es cuando en vez de "$$" tengo un string con contenido generado por un usuario que puede tener o no tener "$$" como substring.

Las opciones que se me ocurren son:
* escapar los $ de lo ingresado por el usuario antes de usar el replace.
* usar este truco con la funcion.

feliam dijo...

otrah osiones...

javascript:"aDb".replace("D","\u0024")
javascript:unescape("aDb".replace("D",escape("$")))