之前在写收藏夹的功能开发的时候,遇到一个神奇的bug,当时怎么想也想不明白为什么会是这样子的结果。
是这样子的一个需求,相当于一组数据中筛选出一堆book_开头并以数字结尾的字符串,用正则做判断嘛,还是挺简单的,当时写了段代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
function clear(){ var reg = /book_\d+/g; //book_开头,加上数字 var key; for(var i=0, len = storage.length; i<len; i++){ key = storage.key(i); //从localstorage中读取key if(reg.test(key)){ console.log("succe: "+key); //匹配成功时返回succe LocalStorage.removeItem(key); i=i-1; len=len-1; }else{ console.log("error: "+key); //匹配失败时返回error } } LocalStorage.setItem("xuanfengKey","0"); } |
来看下数据
来看下刚才的代码匹配的结果
分析下结果,就像是偶数结尾的都匹配成功,而奇数结尾的都匹配失败。翻一下刚才的那段代码,确实找不出什么出错的地方在哪,在看到答案之前你也可以试着找找看。在群里面提问之后,终于有人回答了。
答案:
原因是RegExp有个lastIndex, 加了g之后匹配成功不重置,匹配失败才重置, 所以导致这行第一次成功,第二次失败,之前的正则:var reg =/book_\d+/g; 去掉全局匹配就行了。
这个小细节之前一直没注意过,试了一下确实是这样的,所以这些都是靠平时积累。就像是以前和现在的我,在面对bug时,反正是完全不一样的,以前都有种想法说,自己应该找不出bug在哪或者是说不能一眼看出来而是需要花时间去测试才知道。不像现在,基本一看就知道哪里错了,有种神测的赶脚,这也算是一种进步吧,继续努力~
暂无评论