乐趣区

关于javascript:js中在循环中使用正则表达式遇到的小坑

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。

退出移动版