js循環(huán)中使用正則失效異常的踩坑實(shí)戰(zhàn)
1、異常案例:
使用正則匹配111
const regular = /111/g; // 匹配111
// console.log(regular.test('111')); // true 匹配成功
// console.log(regular.test('111,111')); // true 匹配成功
const list = [
'111',
'111',
'111,111',
'111,111'
];
list.forEach((element, index) => {
// 異常寫法
console.log('log_________' + regular.test(element));
});
// 打印結(jié)果
// log_________true
// log_________false // 會存在正則匹配為false的異常
// log_________true
// log_________truewhy? 首先去MDN看了看正則的基礎(chǔ)概念。
發(fā)現(xiàn)了lastIndex 這個屬性。
2、原因分析
用正則表達(dá)式只要設(shè)置了全局匹配標(biāo)志 /g ,test()方法 的執(zhí)行就會改變正則表達(dá)式 lastIndex 屬性。再循環(huán)中連續(xù)的執(zhí)行 test() 方法,后面的執(zhí)行將會從 lastIndex 數(shù)字處開始匹配字符串。
原來如此,看來test() 方法確實(shí)也不能隨便濫用。
確認(rèn)驗(yàn)證一下:
const regular = /111/g; // 匹配111
const list = [
'111',
'111',
'111,111',
'111,111'
];
list.forEach((element, index) => {
// 異常寫法
console.log('log_________' + regular.test(element));
// 打印lastIndex
console.info('logLastIndex___' + regular.lastIndex);
});
// 打印結(jié)果
// log_________true
// logLastIndex___3
// log_________false // 確實(shí)因?yàn)閘astIndex為3導(dǎo)致的
// logLastIndex___0
// log_________true
// logLastIndex___3
// log_________true
// logLastIndex___73、解決方法1
上面我們發(fā)現(xiàn)正則test()方法有l(wèi)astIndex屬性,每次循環(huán)給恢復(fù)一下。
const regular = /111/g; // 匹配111
const list = [
'111',
'111',
'111,111',
'111,111'
];
list.forEach((element, index) => {
regular.lastIndex = 0;
console.log('log_________' + regular.test(element)); // 打印正常
});問題解決 OK了。
3、解決方法2
上面我們發(fā)現(xiàn)正則表達(dá)式設(shè)置了全局標(biāo)志 /g 的問題,去掉/g全局匹配。(這個具體還得看自己的應(yīng)用場景是否需要/g)
const regular = /111/; // 去掉/g全局匹配
const list = [
'111',
'111',
'111,111',
'111,111'
];
list.forEach((element, index) => {
console.log('log_________' + regular.test(element)); // 打印正常
});OK了。
3、解決方法3
js有基本數(shù)據(jù)類型和引用數(shù)據(jù)類型
ECMAScript包括兩個不同類型的值:基本數(shù)據(jù)類型和引用數(shù)據(jù)類型。\
基本數(shù)據(jù)類型:Number、String、Boolen、Undefined、Null、Symbol、Bigint。\
引用數(shù)據(jù)類型:也就是對象類型Object type,比如:對象(Object)、數(shù)組(Array)、函數(shù)(Function)、日期(Date)、正則表達(dá)式(RegExp)。
so正則表達(dá)式屬于引用數(shù)據(jù)類型,按傳統(tǒng)思維肯定是需要“深拷貝”的,需要new 一個新Object。
const regular = /111/g;
const list = [
'111',
'111',
'111,111',
'111,111'
];
list.forEach((element, index) => {
// 正確寫法 new RegExp的內(nèi)存指向在循環(huán)過程中每次都單獨(dú)開辟一個新的“對象”,不會和前幾次的循環(huán)regular.test(xxx)改變結(jié)果而混淆
// console.log('log_________' + /111/g.test(element)); // 這樣寫當(dāng)然也行
console.log('log_________' + new RegExp(regular).test(element)); // 打印OK了
});OK了。
總結(jié)
到此這篇關(guān)于js循環(huán)中使用正則失效異常的踩坑的文章就介紹到這了,更多相關(guān)js循環(huán)中正則失效異常內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于BootStrap實(shí)現(xiàn)局部刷新分頁實(shí)例代碼
這篇文章主要介紹了基于BootStrap實(shí)現(xiàn)局部刷新的分頁的相關(guān)資料,非常不錯,代碼簡單易懂,具有參考價值,需要的朋友可以參考下2016-08-08
typescript編寫微信小程序創(chuàng)建項(xiàng)目的方法
這篇文章主要介紹了typescript編寫微信小程序創(chuàng)建項(xiàng)目的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01
ie瀏覽器使用js導(dǎo)出網(wǎng)頁到excel并打印
簡單介紹一種可以使用簡單的JS來實(shí)現(xiàn)把網(wǎng)頁中的信息原樣導(dǎo)出到Excel、還可以打印的方法,需要的朋友可以參考下2014-03-03
javascript獲取下拉列表框當(dāng)中的文本值示例代碼
需要將用戶點(diǎn)擊下拉列表當(dāng)中某個選項(xiàng)后,將其所選的內(nèi)容保存起來,下面與大家分享下如何使用js獲取下拉列表框文本值,由此需求的朋友可以參考下2013-07-07
JavaScript調(diào)用傳遞變量參數(shù)的相關(guān)問題及解決辦法
本文給大家介紹javascript調(diào)用傳遞變量參數(shù)的相關(guān)問題及解決辦法,涉及到j(luò)s調(diào)用傳遞參數(shù)相關(guān)知識,對js調(diào)用傳遞參數(shù)感興趣的朋友一起學(xué)習(xí)吧2015-11-11
JavaScript DOM節(jié)點(diǎn)添加示例
本節(jié)為大家介紹下JavaScript DOM節(jié)點(diǎn)添加,將node里面的str放到h1段落中使之成為h1的新段落2014-07-07
JavaScript數(shù)組分組groupBy示例詳解
JavaScript?最近發(fā)布了一個方法?Object.groupBy,可以對可迭代對象中的元素進(jìn)行分組,這篇文章主要介紹了JavaScript數(shù)組分組groupBy示例,需要的朋友可以參考下2023-12-12

