我最近查阅javascript资料,发现了一个函数:
复制代码 代码如下:
function format(s)
{
var args = arguments;
var pattern = new RegExp("%([1-" + arguments.length + "])","g");
return String(s).replace(pattern,function(word,index){
return args[index];
});
}
// test
window.onload = alert(format("And the %1 want to know whose %2 you %3", "papers", "shirt", "wear"));
//And the papers want to know whose shirt you wear
这种功能的函数,在shell或java都似曾见过,但是在javascript函数实现的方法很新颖。新颖的地方就是在:
复制代码 代码如下:
return String(s).replace(pattern,function(word,index){
return args[index];
});
但是这里String类的replace的用法和我平时用的很不一样,我以前写过一个这样的replace的函数:
复制代码 代码如下:
function myReplace(s)
{
return String(s).replace(/CJ[0-9]{2}/g,function(word){
return word = 'CJJK00';
});
}
//window.onload = alert(myReplace('CJ9080,CJ8976,CJ12919,CJ8765'));//CJJK0080,CJJK0076,CJJK00919,CJJK0065
我在使用replace时候,如果第二个参数是function我一般都只用到第一个参数,基本没有思考它的第二个,第三个或者更多的参数,现在看到有人使用了第二个参数,就很想探求下replace第二个参数使用到了function时候,里面参数到底有多少个,每个的含义到底如何?
下面是我改写了我自己写的替换函数:
复制代码 代码如下:
function myReplaceFtn(s)
{
return String(s).replace(/CJ[0-9]{2}/g,function(word,index){
return word = 'CJJK00@' + index + "@";
});
}
//window.onload = alert(myReplaceFtn('CJ9080,CJ8976,CJ12919,CJ8765'));//CJJK00@0@80,CJJK00@7@76,CJJK00@14@919,CJJK00@22@65
本来我以为,函数format里的function(word,index),我认为应该是正则表达式所匹配字符串的索引(%1的索引为1,%2的索引为2,%3的索引为3),而我写的函数里面第二个参数index不是被匹配到字符串的索引,而是被匹配到的字符在原字符串的位置。下面我做了这样的测试:
复制代码 代码如下:
function format(s)
{
var args = arguments;
var pattern = new RegExp("%([1-" + arguments.length + "])","g");
return String(s).replace(pattern,function(word,index){
alert("arguments.length:" + arguments.length);//4
return args[index];
});
}
function myReplaceFtn(s)
{
return String(s).replace(/CJ[0-9]{2}/g,function(word,index){
alert("arguments.length:" + arguments.length);//3
return word = 'CJJK00@' + index + "@";
});
}
函数format里面function(word,index)的参数有4个,而函数myReplaceFtn(s)里面function(word,index)的参数有3个。为什么会有这样的不同?我做了如下测试:
复制代码 代码如下:
//以下程序在firefox里面运行
function newformat(s)
{
var args = arguments;
var pattern = new RegExp("%([1-" + arguments.length + "])","g");
return String(s).replace(pattern,function(word,index){
console.log("arguments.length:" + arguments.length);
for (var i = 0,j = arguments.length;i<j;i++)
{
console.log("标示newformat" + i + ":" + arguments[i]);
}
return args[index];
});
}
function newmyReplace(s)
{
return String(s).replace(/CJ[0-9]{2}/g,function(word){
console.log("arguments.length:" + arguments.length);
for (var i = 0,j = arguments.length;i<j;i++)
{
console.log("标示newmyReplace" + i + ":" + arguments[i]);
}
return word = 'CJJK00';
});
}
结果:
arguments.length:4
标示newformat0:%1
标示newformat1:1
标示newformat2:8
标示newformat3:And the %1 want to know whose %2 you %3
arguments.length:4
标示newformat0:%2
标示newformat1:2
标示newformat2:30
标示newformat3:And the %1 want to know whose %2 you %3
arguments.length:4
标示newformat0:%3
标示newformat1:3
标示newformat2:37
标示newformat3:And the %1 want to know whose %2 you %3
arguments.length:3
标示newmyReplace0:CJ90
标示newmyReplace1:0
标示newmyReplace2:CJ9080,CJ8976,CJ12919,CJ8765
arguments.length:3
标示newmyReplace0:CJ89
标示newmyReplace1:7
标示newmyReplace2:CJ9080,CJ8976,CJ12919,CJ8765
arguments.length:3
标示newmyReplace0:CJ12
标示newmyReplace1:14
标示newmyReplace2:CJ9080,CJ8976,CJ12919,CJ8765
arguments.length:3
标示newmyReplace0:CJ87
标示newmyReplace1:22
标示newmyReplace2:CJ9080,CJ8976,CJ12919,CJ8765
对于回调函数里的arguments值现在比较清晰了,arguments个数的不同应该和我们写的正则表达式有关系,不管怎样,第一个参数是匹配到的字符串,最后一个是原字符串,倒数第二个参数是匹配到的字符串的在原字符串索引的起始位,像format里的第二个参数index根据情况而定了,我自己写的newmyReplace里没有这个参数,format的index参数是%[1-4],里面的1-4,不过还是写个方法确定下:
复制代码 代码如下:
function charFormat(s)
{
var pattern = new RegExp("%([a-d])","g");
return String(s).replace(pattern,function(word,index){
switch(index)
{
case 'a':
return 'thisisA';
case 'b':
return 'thisisB';
case 'c':
return 'thisisC';
case 'd':
return 'thisisD';
default:
return 'thisisNULL';
}
});
}
window.onload = console.log(charFormat("And the %a want to know whose %d you %b", "papers", "shirt", "wear"));
//And the thisisA want to know whose thisisD you thisisB
由此可见String的replace是相当的强大,不过本人正则表达式功力还不够,不知道还有什么别的特别的正则表达式会产生什么不同的结果。另外不知道谁有javascript里面String类replace原始写法,希望能贡献出来,我想好好研究下。
相关推荐:
SEO与SEM:谁才是提升网站流量的王者?,Ai中字体如何变形立体
SEO功能:助力网站流量提升与品牌曝光,天津公司网站建设与维护
seo类文章是什么,seo技术文章 ,ai3.5-ai聊天
ChatGPT页面怎么拖不动?解决问题的终极指南,日韩AI换脸在线观看
SEO导流:如何通过精准优化实现网站流量大爆发,网站优化优化怎么做
为什么选择B站VIP?让你畅享更丰富的视听体验,小门类网站seo
AI优化文章:如何利用人工智能提升写作效率和质量
SEO包含的秘密:让你的网站轻松排上首页,新媒体营销推广方案目录
互联网留痕:数字时代的隐形轨迹与自我管理,灯塔网站推广包年多少钱
“标题制造机”:颠覆内容创作的秘密武器,助你轻松打造吸引力十足的标题,景区线上推广用哪些网站
AI网页版智能问答,开启智慧沟通新时代,ai梦境档案用不了手柄
如何识别文章是否由AI撰写?揭开智能写作的秘密
一秒采集:提升效率、创造价值的秘密武器,苏州网站整站优化
SEO关键词利器:如何借助精准关键词提升网站流量与排名,ai绘画客户
今时CMS:引领数字化转型的智慧之选,河南seo优化网站联系方式
ChatGPTApp怎么调大字体?提升阅读体验,让文字更清晰,推荐ai音频
SEO快速优化文章排名:提升网站流量的必备技巧,ai小苹果会员分享
为什么选择老域名工具?提升网站SEO与品牌影响力的秘密武器,软文与seo文章区别
文章AI生成:让创作变得更简单、更高效!
中文润色:提升表达的艺术,打造无懈可击的语言魅力,广告营销推广新思路论文
AI人工智能生成文章:开启写作新时代
ChatGPT打不开网页?看完这篇你就懂了!,国内ai写作安卓软件
ChatGPT出现错误503?你需要知道的解决方案和应对策略,ai拉伸字效
ChatGPT维护-智能时代的数字助手,如何让你的工作更高效,ai智能救援
为什么越来越多的人选择在知乎发布文章?这里面的机会你可能还没发现!,潍坊关键词排名提升
AI自动生成:开启智能时代的无限可能,ai熊熊图片
用AI创作的文章算原创吗?深度背后的逻辑与意义
ChatGPT安装包Windows版-让智能助手触手可得,q和ai
SEO引擎优化方法-让你的网站流量暴增的实战指南,ai智慧树
SEO优化排名:让您的网站在搜索引擎中脱颖而出,我ai 达瓦仓决
seo该从什么开始,seo是什么时候开始的 ,ai写作免费英文怎么说
SEO刷:让你的网站一夜之间登顶搜索引擎!,独特seo技巧
AI代写文章:高效创作的新风尚
ChatGPT桌面版无法加载?快速解决方案及常见问题解析,ai媚眼
好用的AI写作工具,提升写作效率与创意的最佳选择
SEO特点与实施策略:提升网站流量与排名的关键,定西抖音seo价格查询
优化*:打造更加高效、创新的娱乐体验,石排网站建设制作多少钱
AI写作免费一键生成下载,助您轻松创作!
seo软件叫什么,seo软件视频教程 ,eps ai 缩略图
SEO快排还有效果吗揭秘快速排名的真相与未来趋势,ai人像波普
AI免费写文章:让创作变得轻松高效
什么是seo反连接,网站反链多好还是少好 ,网易ai产品
seo适合什么行业,seo适合的行业 ,在ai如何矢量化
ChatGPT空白对话:释放创意,开启智能对话的新世界,ai重庆南坪
怎样使用AI写文章:释放创作潜能,提升写作效率
AI免费文章解读:智能写作新篇章,小店AI
ChatGPT怎么突然不能打开了?你需要了解的原因与解决办法,ai写作有什么问题吗怎么解决
主流seo是什么,seo是什么推广网站 ,AI心理师
SEO排序:如何让你的网页在搜索引擎中脱颖而出,平谷抖音seo推广招聘
SEO与SEM策略:提升网站流量与品牌曝光的双剑合璧,ai补图