javascript吸引我的一个地方:
总能在别人的代码中看到另一个javascript。
好2
这不,好戏来了,
var i=0 while(/abc/g.exec('abcabc')) i++
问, i 是多少?
当你发现RegExp对象用一个lastIndex属性记录下次匹配的起始位置时,你会逗比的一笑,要多2才会写出上面的代码!
别急,再测一下你的智商,下面的代码输出又是什么?
var exp = /abc/ while(exp.exec('abcabc')){ console.log(exp.lastIndex) }
不好意思,又死循环了
注意的地方:
-
不具有标志 g 和不表示全局模式的 RegExp 对象不能使用 lastIndex 属性
-
如果在成功地匹配了某个字符串之后就开始检索另一个新的字符串,需要手动地把这个属性设置为 0
你好直观
一直很难掌握replace中的$符,直到看了下面兄台的代码,瞬间领悟了。
var str = 'abcde'; var exp = /((b).(d))/; str.replace(exp , "--[not-match-before-match-$ ``]-[result-match-$ &]-[group1-$1,group2-$2,group3-$3]-[not-match-end-match-$ ']--")
因为markdown解析器的原因,$符后面跟着一个空格,正确的是下面的样子
"--[not-match-before-match-$`]-[result-match-$&]-[group1-$1,group2-$2,group3-$3]-[not-match-end-match-$']--"
问既然$有特殊意义,那如何表示$, $$
replace有惊喜
被人问到一事,replace中替换函数的参数问题:
function replaceFn (){ for (i in arguments) console.log("arguments " + i +" :value=" + arguments[i] ) return arguments[0] } var str='abcabcabc' var exp = /(c)(a)/g str.replace(exp , replaceFn )
ECMA3 规定,replace方法的参数 replacement 可以是函数,这时,每个匹配都调用该函数,函数返回的字符串将作为替换文本使用。该函数的第一个参数是匹配模式的字符串。接下来的参数是与模式中的子表达式匹配的字符串,可以有0个或多个这样的参数。接下来的参数是一个整数,声明了匹配在 stringObject 中出现的位置。最后一个参数是 stringObject 本身。
jQuery中是这么用的:
rmsPrefix = /^-ms-/ rdashAlpha = /-([\da-z])/gi function camelCase( string ) { return string.replace( rmsPrefix, "ms-" ) .replace( rdashAlpha, function( all, letter ) { return letter.toUpperCase(); }); }
这段代码可以把a-bc-def置换为aBcDef。
angular就更加凶残了,
var SPECIAL_CHARS_REGEXP = /([\:\-\_]+(.))/g; var MOZ_HACK_REGEXP = /^moz([A-Z])/; function camelCase(name) { return name. replace(SPECIAL_CHARS_REGEXP, function(_, separator, letter, offset) { return offset ? letter.toUpperCase() : letter; }). replace(MOZ_HACK_REGEXP, 'Moz$1'); }
angular可以把a:bc:def , a_bc_def , a-bc-def统统替换为aBcDef。
angular的开发者技高一筹的用到了替换函数的倒数第二个参数--匹配出现在原字符串中的位置
seajs中也有亮点,解析factory函数依赖时,replace函数的使用,瞬间高大上了不少。
function parseDependencies(code) { var ret = [] code.replace(SLASH_RE, "") .replace(REQUIRE_RE, function(m, m1, m2) { if (m2) ret.push(m2) }) return ret }
很过瘾
网友评论