<script type="text/javascript"> String.prototype.format = function() { if (arguments.length == 0) return this; function k(n) { var a, s = n.toString(); if (n > 9) { //只做了双位处理 //\d|1[0-2] //\d\d?|10\d|11[0-2] a = s.split(""); return "\\d|" + a[0] + "[0-" + a[1] + "]"; } else { return "[0-" + s + "]"; } }; var arg = arguments; return this.replace(new RegExp("\\{(" + k(arg.length - 1) + ")\\}", "g"), function (a, b) { return arg[b]; }); }; var str = "{0}{1}{1}{1}{1}{2}{3}{4}{5}{6}{7}{8}{9}{10}{11}"; alert(str.format("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k")); </script><script type="text/javascript"> String.prototype.format = function() { if (arguments.length == 0) return this; for (var i = 0, n = "", c = ""; i < arguments.length; i ++) { n += c + i; c = "|"; } var arg = arguments; return this.replace(new RegExp("\\{(" + n + ")\\}", "g"), function (a, b) { return arg[b]; }); }; var str = "{0}{1}{1}{1}{1}{2}{3}{4}{5}{6}{7}{8}{9}{10}{11}"; alert(str.format("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k")); </script> 这两个哪个好些呢? for (var s = this, i = 0; i < arguments.length; i ++) { s = s.replace(new RegExp("\\{" + i + "\\}", "g"), arguments[i]); } 应该比这个效率上要好些吧?
TO: muxrwc(王辰) 你的两段代码都没有跳出 RegExp 里套函数的模式,这个与我的第一段代码没有什么区别,效率上不会有什么提高的。且你的代码没有对低版本的浏览器的兼容,并不是所有浏览器都支持正则里套函数的。
噢。知道了。。 感觉上。。 for (var s = this, i = 0; i < arguments.length; i ++) { s = s.replace(new RegExp("\\{" + i + "\\}", "g"), arguments[i]); } 这个是把s查找了arguments.length - 1遍 我那种是查找了一遍查找的时候多限制了一些。 而你的那个第一种,如果字符串里有N多{number}用不到,并且被匹配捕获出来然后又没有变动。。
http://community.csdn.net/Expert/TopicView.asp?id=5236016]PS: 虽然我已经弄懂了, 不过方法可能有点笨.
* base object system extend - String
*/
void function() {
String.format = function(format) {
for (var i = 1; i < arguments.length; i++) {
format = format.replace("{" + (i - 1) + "}", arguments[i]);
}
return format;
}
}();Qomo里的方法.
http://blog.csdn.net/aimingoo/archive/2006/09/17/1232359.aspx
<script type="text/javascript">/*<![CDATA[*/
String.prototype.format=function()
{
if(arguments.length==0) return this;
for(var s=this, i=0; i<arguments.length; i++)
{
s=s.replace(new RegExp("\\{"+i+"\\}","g"), arguments[i]);
}
return s;
};
var str = "{0}{1}{1}{1}{1}{2}{3}{4}{5}{6}{7}{8}{9}";
alert(str.format("a", "b", "c", "d", "e", "f", "g"));
/*]]>*/
</SCRIPT>
String.prototype.format = function() {
if (arguments.length == 0) return this;
function k(n) {
var a, s = n.toString();
if (n > 9) {
//只做了双位处理
//\d|1[0-2]
//\d\d?|10\d|11[0-2]
a = s.split("");
return "\\d|" + a[0] + "[0-" + a[1] + "]";
} else {
return "[0-" + s + "]";
}
};
var arg = arguments;
return this.replace(new RegExp("\\{(" + k(arg.length - 1) + ")\\}", "g"), function (a, b) { return arg[b]; });
};
var str = "{0}{1}{1}{1}{1}{2}{3}{4}{5}{6}{7}{8}{9}{10}{11}";
alert(str.format("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k"));
</script><script type="text/javascript">
String.prototype.format = function() {
if (arguments.length == 0) return this;
for (var i = 0, n = "", c = ""; i < arguments.length; i ++) {
n += c + i;
c = "|";
}
var arg = arguments;
return this.replace(new RegExp("\\{(" + n + ")\\}", "g"), function (a, b) { return arg[b]; });
};
var str = "{0}{1}{1}{1}{1}{2}{3}{4}{5}{6}{7}{8}{9}{10}{11}";
alert(str.format("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k"));
</script>
这两个哪个好些呢?
for (var s = this, i = 0; i < arguments.length; i ++) {
s = s.replace(new RegExp("\\{" + i + "\\}", "g"), arguments[i]);
}
应该比这个效率上要好些吧?
你的两段代码都没有跳出 RegExp 里套函数的模式,这个与我的第一段代码没有什么区别,效率上不会有什么提高的。且你的代码没有对低版本的浏览器的兼容,并不是所有浏览器都支持正则里套函数的。
感觉上。。
for (var s = this, i = 0; i < arguments.length; i ++) {
s = s.replace(new RegExp("\\{" + i + "\\}", "g"), arguments[i]);
}
这个是把s查找了arguments.length - 1遍
我那种是查找了一遍查找的时候多限制了一些。
而你的那个第一种,如果字符串里有N多{number}用不到,并且被匹配捕获出来然后又没有变动。。
s = s.replace(new RegExp("\\{"+i+"\\}","g"), arguments[i]);
比我说那两种快了n。。
比例是1 : 6 ++
这个也很快。和第一那个的比例是3:1
因为用了正则的字符慢了好多啊
是
s = s.split("{" + i + "}").join(arguments[i]);
和
s = s.replace(new RegExp("\\{" + i + "\\}", "g"), arguments[i]);
这种方法肯定比 split-join 的方法要快的,且又可以兼容低版本的浏览器,所以我就只用它了
牛X的人啊,CSDN的风云人物,骨灰级大师啊,我N体投地(N等于无限大)
这句看不明白后面的a和b的值从哪过来的?
<script type="text/javascript">/*<![CDATA[*/
String.prototype.format=function()
{
if(arguments.length==0) return this;
for(var s=this, i=0; i<arguments.length; i++)
{
s=s.replace(new RegExp("\\{"+i+"\\}","g"), arguments[i]);
}
return s;
};
var str = "{0}{1}{1}{1}{1}{2}{3}{4}{5}{6}{7}{8}{9}";
alert(str.format("a", "b", "c", "d", "e", "f", "g"));
/*]]>*/
</SCRIPT>