最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

js循環(huán)中使用正則失效異常的踩坑實戰(zhàn)

 更新時間:2023年05月08日 08:48:18   作者:天渺工作室  
這篇文章主要給大家介紹了關(guān)于js循環(huán)中使用正則失效異常的踩坑實戰(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_________true

why? 首先去MDN看了看正則的基礎概念。

發(fā)現(xiàn)了lastIndex 這個屬性。

2、原因分析

    用正則表達式只要設置了全局匹配標志 /g ,test()方法 的執(zhí)行就會改變正則表達式 lastIndex 屬性。再循環(huán)中連續(xù)的執(zhí)行 test() 方法,后面的執(zhí)行將會從 lastIndex 數(shù)字處開始匹配字符串。

原來如此,看來test() 方法確實也不能隨便濫用。

確認驗證一下:

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  // 確實因為lastIndex為3導致的
    // logLastIndex___0
    // log_________true
    // logLastIndex___3
    // log_________true
    // logLastIndex___7

3、解決方法1

上面我們發(fā)現(xiàn)正則test()方法有l(wèi)astIndex屬性,每次循環(huán)給恢復一下。

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)正則表達式設置了全局標志 /g 的問題,去掉/g全局匹配。(這個具體還得看自己的應用場景是否需要/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)、正則表達式(RegExp)。

so正則表達式屬于引用數(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)過程中每次都單獨開辟一個新的“對象”,不會和前幾次的循環(huán)regular.test(xxx)改變結(jié)果而混淆
        // console.log('log_________' + /111/g.test(element)); // 這樣寫當然也行
        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)文章

最新評論

湖南省| 陆良县| 鄢陵县| 英吉沙县| 新昌县| 杭州市| 交口县| 霍林郭勒市| 郯城县| 晋城| 昌黎县| 武定县| 安陆市| 天镇县| 阿图什市| 腾冲县| 勃利县| 和硕县| 蕲春县| 吉林省| 二手房| 康定县| 日照市| 大冶市| 巍山| 邛崃市| 房山区| 郓城县| 凤冈县| 鲁山县| 平利县| 宁城县| 平顶山市| 阿鲁科尔沁旗| 东辽县| 灌阳县| 南投县| 五家渠市| 逊克县| 金华市| 南昌市|