欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2023年05月08日 08:48:18   作者:天渺工作室  
這篇文章主要給大家介紹了關(guān)于js循環(huán)中使用正則失效異常的踩坑實(shí)戰(zhàn),文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

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) => {
        // 異常寫(xiě)法
        console.log('log_________' + regular.test(element));
    });  
    // 打印結(jié)果 
    // log_________true
    // log_________false // 會(huì)存在正則匹配為false的異常
    // log_________true
    // log_________true

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

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

2、原因分析

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

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

確認(rèn)驗(yàn)證一下:

const regular = /111/g; // 匹配111

    const list = [
        '111',
        '111',
        '111,111',
        '111,111'
    ];
    list.forEach((element, index) => {
        // 異常寫(xiě)法
        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___7

3、解決方法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)); // 打印正常
    });

問(wèn)題解決 OK了。

3、解決方法2

上面我們發(fā)現(xiàn)正則表達(dá)式設(shè)置了全局標(biāo)志 /g 的問(wèn)題,去掉/g全局匹配。(這個(gè)具體還得看自己的應(yīng)用場(chǎ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ù)類(lèi)型和引用數(shù)據(jù)類(lèi)型

ECMAScript包括兩個(gè)不同類(lèi)型的值:基本數(shù)據(jù)類(lèi)型和引用數(shù)據(jù)類(lèi)型。\

基本數(shù)據(jù)類(lèi)型:Number、String、Boolen、Undefined、Null、Symbol、Bigint。\

引用數(shù)據(jù)類(lèi)型:也就是對(duì)象類(lèi)型Object type,比如:對(duì)象(Object)、數(shù)組(Array)、函數(shù)(Function)、日期(Date)、正則表達(dá)式(RegExp)。

so正則表達(dá)式屬于引用數(shù)據(jù)類(lèi)型,按傳統(tǒng)思維肯定是需要“深拷貝”的,需要new 一個(gè)新Object。

const regular = /111/g;
    const list = [
        '111',
        '111',
        '111,111',
        '111,111'
    ];
    list.forEach((element, index) => {
        // 正確寫(xiě)法 new RegExp的內(nèi)存指向在循環(huán)過(guò)程中每次都單獨(dú)開(kāi)辟一個(gè)新的“對(duì)象”,不會(huì)和前幾次的循環(huán)regular.test(xxx)改變結(jié)果而混淆
        // console.log('log_________' + /111/g.test(element)); // 這樣寫(xiě)當(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • js窗口震動(dòng)小程序分享

    js窗口震動(dòng)小程序分享

    這篇文章主要為大家分享了js窗口震動(dòng)小程序,可設(shè)置抖動(dòng)的頻率,范圍,和次數(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • js實(shí)現(xiàn)點(diǎn)擊添加一個(gè)input節(jié)點(diǎn)

    js實(shí)現(xiàn)點(diǎn)擊添加一個(gè)input節(jié)點(diǎn)

    本文給大家分享的是一段點(diǎn)擊自動(dòng)添加inpu節(jié)點(diǎn)的代碼,非常的簡(jiǎn)單實(shí)用,這里推薦給大家。
    2014-12-12
  • JavaScript檢測(cè)上傳文件大小的方法

    JavaScript檢測(cè)上傳文件大小的方法

    這篇文章主要介紹了JavaScript檢測(cè)上傳文件大小的方法,涉及javascript針對(duì)上傳文件的相關(guān)判定技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • JavaScript實(shí)現(xiàn)淺拷貝與深拷貝的方法分析

    JavaScript實(shí)現(xiàn)淺拷貝與深拷貝的方法分析

    這篇文章主要介紹了JavaScript實(shí)現(xiàn)淺拷貝與深拷貝的方法,結(jié)合實(shí)例形式總結(jié)分析了JavaScript淺拷貝與深拷貝的定義與使用方法,需要的朋友可以參考下
    2018-07-07
  • JS設(shè)計(jì)模式之命令模式概念與用法分析

    JS設(shè)計(jì)模式之命令模式概念與用法分析

    這篇文章主要介紹了JS設(shè)計(jì)模式之命令模式概念與用法,簡(jiǎn)單描述了命令模式的原理、功能并結(jié)合javascript實(shí)例形式分析了命令模式相關(guān)定義與使用技巧,需要的朋友可以參考下
    2018-02-02
  • 如何基于viewport vm適配移動(dòng)端頁(yè)面

    如何基于viewport vm適配移動(dòng)端頁(yè)面

    這篇文章主要介紹了如何基于viewport vm適配移動(dòng)端頁(yè)面,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • js實(shí)現(xiàn)簡(jiǎn)單廣告小窗口

    js實(shí)現(xiàn)簡(jiǎn)單廣告小窗口

    這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)簡(jiǎn)單廣告小窗口,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • JS面試題之如何判斷兩個(gè)數(shù)組的內(nèi)容是否相等

    JS面試題之如何判斷兩個(gè)數(shù)組的內(nèi)容是否相等

    這篇文章主要為大家詳細(xì)介紹了JavaScript面試的常考題,即如何判斷兩個(gè)數(shù)組的內(nèi)容是否相等,文中的示例方法講解詳細(xì),需要的小伙伴可以參考一下
    2023-10-10
  • JavaScript DOM節(jié)點(diǎn)操作方法總結(jié)

    JavaScript DOM節(jié)點(diǎn)操作方法總結(jié)

    下面小編就為大家?guī)?lái)一篇JavaScript DOM節(jié)點(diǎn)操作方法總結(jié)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-08-08
  • webpack 插件html-webpack-plugin的具體使用

    webpack 插件html-webpack-plugin的具體使用

    本篇文章主要介紹了webpack 插件html-webpack-plugin的具體使用,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04

最新評(píng)論