js中在迴圈中使用正規表示式遇到的小坑

天渺工作室發表於2023-04-16

1、基本資料型別和引用資料型別

ECMAScript包括兩個不同型別的值:基本資料型別和引用資料型別。\
基本資料型別:Number、String、Boolen、Undefined、Null、Symbol、Bigint。\
引用資料型別:也就是物件型別Object type,比如:物件(Object)、陣列(Array)、函式(Function)、日期(Date)、正規表示式(RegExp)。

so正規表示式屬於引用資料型別。

2、專案中在迴圈中使用正則

\
使用正則匹配111

    const regular = /111/g; // 匹配111
    console.log(regular.test('111')); // true 匹配成功
    console.log(regular.test('111,111')); // true 匹配成功

迴圈中使用正則的異常寫法

    const regular = /111/g; // 匹配111
    const list = [
        '111',
        '111',
        '111,111',
        '111,111',
        '111',
        '111',
        '111,111',
        '111,111',
        '111',
        '111',
        '111,111',
        '111,111',
    ];
    list.forEach((element, index) => {
        // 異常寫法
        console.log('log_________' + regular.test(element));
    });    
    

列印還存在false。\
原因:/111/g 這種寫法看起來像string,但終究還是正則,正則屬於引用型資料型別。引用型資料型別 傳統意義中 需要我們"深複製"或者開闢新記憶體 new Object() 才能使其 記憶體指向獨立出來,而不是讓記憶體指向一直指向初始定義時的源頭。

迴圈中使用正則的正確寫法

    const regular = /111/g; // 匹配111
    const list = [
        '111',
        '111',
        '111,111',
        '111,111',
        '111',
        '111',
        '111,111',
        '111,111',
        '111',
        '111',
        '111,111',
        '111,111',
    ];
    list.forEach((element, index) => {
        // 正確寫法 new RegExp的記憶體指向在迴圈過程中每次都單獨開闢一個新的“物件”,不會和前幾次的迴圈regular.test(xxx)改變結果而混淆
        // console.log('log_________' + /111/g.test(element)); // 這樣寫當然也行
        console.log('log_________' + new RegExp(regular).test(element));
    });    
    

列印OK。

相關文章