I am definitely for this, to make this special replacement patterns optional. As I also consider `replace` function to be dangerous when speaking about `(string, string)` replacement, and I also use custom util function for doing this. But for the `(regexp, string)` interface those replacement patterns are more often useful. But it would be nice, when there were the possibility to switch this option off, as it sometimes could lead to some unexpected replacements, that could cause the unexpected behaviour.
Date: Mon, 28 Jul 2014 14:52:56 +0200 From: cmarten...@gmail.com To: es-discuss@mozilla.org Subject: String.prototype.replace() problems with JSON.stringify() and serialization of Objects Hey everyone, I wanted to ask if there's a plan to offer something like String.prototype.replace(search, replace, stringmode) as an alternative API for String.prototype.replace()? The problem I'm refering here is that the ECMA spec section 15.5.4.11 is using the replaceValue as a string that gets parsed (and may contain a $ character). http://www.ecma-international.org/ecma-262/5.1/#sec-15.5.4.11 So, if you are serializing an Object via toJSON() and want to attach the Function.prototype.toString(), the resulting string may contain a $ character, even if it is written as a statement. As the String.prototype.replace API doesn't offer an option to turn off the "parsing" of the replaceValue, I think this is a conceptional flaw in the API design. Example: var func = function() { var y = [ 52, '$']; return null; }; var data = func.toString(); var x = 'This is a simple {{blob}}'; var y = x.replace('{{blob}}', data); // Not the expected behaviour because of $ character Suggestion: If you want to replace the string "much simplier" by calling it this way, it would save performance and allow you to replace raw strings using the simplest way, which is a simple indexOf() and substr(). var data = func.toString(); // Inside an engine, this would be a JSON.stringify(environment); or similar var x = 'This is a simple {{blob}}'; var y = x.replace('{{blob}}', data, true); // note the suggested optional flag An example implementation I made for showing the usage I would prefer: String.prototype.replace = function(key, value, raw) { if (raw === true) { var keyl = key.length; var keyi = this.indexOf(key); return '' + this.substr(0, keyi) + value + this.substr(keyi + keyl, this.length - keyl); } else { // Old behaviour } return this; }; What do you guys think about the idea? PS: Currently, I have to polyfill a custom method for my build templates in my game engine because that API is missing and I think it is pretty important to offer. If you are curious about the use case, it's used for a remote debugger and environment snapshots that allows restoring savegames on a different computer (NodeJS-sdl or Browser or Server or Android or iOS... etc.). Currently the development-0.8 branch, but may merge into master soon: https://github.com/LazerUnicorns/lycheeJS/ Cheers, ~Christoph _______________________________________________ es-discuss mailing list es-discuss@mozilla.org https://mail.mozilla.org/listinfo/es-discuss
_______________________________________________ es-discuss mailing list es-discuss@mozilla.org https://mail.mozilla.org/listinfo/es-discuss