To ttyp:我并不排斥revised BSD,且revised BSD与GPL是兼容的。使用GPL/LGPL,只是因为我更欣赏GPL/LGPL推广Free Software的理念,且这小段代码是从我的PIES项目中攫取,该项目采用GPL/LGPL许可证。LGPL还是很宽松的,一般而言你不必获得我的许可,其实对于这样一小段脚本,我也没有考虑过怎样的用途是不合该许可证而需要得到我的同意的。这只是一小段代码而已,我只是随时传播自由的声明也。
to ttyp 我觉得应该和replace('$1','a').replace('$2','b')这种不同吧,至少匹配的时候不会一次全部匹配结束在重头匹配,就是说lastIndex属性不用移动那么多次,只走一遍
To hbhbhbhbhb1021:不清楚你在说哪个问题,我所指的是各种实现,包括不太好的实现。如果你是说高版本可以用自定义函数替换,而不需要调用多次replace,则ttyp已经回答你了 :) 至于浏览器版本问题,我在blog上已经写了,如jscript 5.5以下的(如ie 5.0默认所带jscript 5.0)确实不行。但现在还使用非ecmascript 3的js引擎已经很稀少了,可忽略之。即使在某些商用环境中,不能升级浏览器如ie 5.0,至少也可只升级脚本引擎的。
TO hax:LGPL是可以转换为商业代码的,有赚取广大free software思想之嫌疑,相对的BSD,appache似乎自由度更大一点,还有个啥协议,只要使用者申明作者的就能使用,忘记名字了。TO hbhbhbhbhb1021(天外水火(我要多努力)) :是不同,但是用了function,至少会产生很多临时变量和堆栈吧
To (hb){5}1021 (名字太长,我用正则来写,呵呵):性能下降的关键在于自定义函数还是要被调用n次,例如"$1 $1 $1 $1".replace(/[$][0-9]/, f),f还是被调用了4次。而且随占位符的增加至少是线形增长。而我所写的实现始终只有一次Array.join和String.replace,且用到正则的复杂度是恒定的,因此整体性能是常数的。
<script language=javascript>
if (!String._FORMAT_SEPARATOR){
String._FORMAT_SEPARATOR = String.fromCharCode(0x1f);
String._FORMAT_ARGS_PATTERN = new RegExp('^[^' + String._FORMAT_SEPARATOR + ']*' + new Array(100).join('(?:.([^' + String._FORMAT_SEPARATOR + ']*))?'));
}
if (!String.format)
String.format = function (s){
return Array.prototype.join.call(arguments, String._FORMAT_SEPARATOR).replace(String._FORMAT_ARGS_PATTERN, s);
}
if (!''.format)
String.prototype.format = function (){
return (String._FORMAT_SEPARATOR +Array.prototype.join.call(arguments, String._FORMAT_SEPARATOR)).replace(String._FORMAT_ARGS_PATTERN, this);
}var name = 'world';
var result = 'Hello $1!'.format(name);
alert(result)var letters = String.format('$1$2$3$4$5$6$7$8$9$10$11$12$13$14$15$16$17$18$19$20$21$22$23$24$25$26', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z');
alert(letters)
</script>
var temp="'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'".replace(/[\' ]/g,'').split(",")
var i=0;
letters='$1$2$3$4$5$6$7$8$9$10$11$12$13$14$15$16$17$18$19$20$21$22$23$24$25$26'.replace(/\$\d{1,2}/g,function(a){return temp[i++]})
alert(letters)
我觉得应该和replace('$1','a').replace('$2','b')这种不同吧,至少匹配的时候不会一次全部匹配结束在重头匹配,就是说lastIndex属性不用移动那么多次,只走一遍