JS:正则表达式和作用域

一、正则表达式

1. 基础定义

正则表达式(RegExp)是匹配字符串字符组合的模式,在JS中可通过字面量(/规则/)或构造函数(new RegExp('规则'))创建,核心用于表单验证、字符串替换/提取等场景。

2. 核心语法(补充高频遗漏点)

(1)基础匹配方法
  • test():检测字符串是否符合规则,返回布尔值(表单验证首选);
  • exec():匹配字符串,成功返回包含匹配结果的数组,失败返回null(适合提取匹配内容)。
(2)核心元字符(补充完整)
类型 符号/写法 说明
边界符 ^/$ ^匹配开头,$匹配结尾(如^abc$仅匹配完整的"abc")
字符类 [] 匹配任意一个字符,如[a-z]匹配小写字母、[0-9]匹配数字
预定义类 \d/\w/\s \d=数字、\w=字母/数字/下划线、\s=空白字符(开发中常用简写)
量词 {n}/{n,m} {n}匹配n次、{n,m}匹配n-m次(如\d{9}匹配9位数字)
修饰符 i/g i忽略大小写、g全局匹配(写在正则末尾,如/abc/ig
(3)分组与替换(实战高频)

()实现分组匹配,结合replace()可实现字符串替换:

javascript 复制代码
// 手机号中间4位脱敏
const phone = '13812345678';
const hidePhone = phone.replace(/^(\d{3})\d{4}(\d{4})$/, '$1****$2');
console.log(hidePhone); // 138****5678

3. 实战示例(表单验证)

javascript 复制代码
// 用户名:6-12位字母/数字/下划线(用预定义类简化)
const usernameReg = /^\w{6,12}$/;
// 手机号:1开头+3-9+9位数字
const phoneReg = /^1[3-9]\d{9}$/;

console.log(usernameReg.test('user_123')); // true
console.log(phoneReg.test('13812345678')); // true

二、作用域

1. 基础定义

作用域规定了变量/函数的可访问范围,JS中核心分为全局作用域局部作用域,ES6新增块级作用域后,局部作用域又细分为函数作用域和块级作用域。

2. 核心知识点(补充高频遗漏点)

(1)作用域分类
  • 全局作用域:最外层声明的变量/函数,整个脚本可访问(浏览器中挂载到window);
  • 函数作用域:函数内部声明的变量,仅函数内可访问,函数执行后销毁(闭包除外);
  • 块级作用域:ES6中let/const声明的变量,在{}(if/for/直接写的{})内生效,外部不可访问(var无块级作用域)。
(2)作用域链

访问变量时,JS引擎先在当前作用域查找,找不到则向上一级查找,直到全局作用域,这个查找链条就是作用域链:

javascript 复制代码
const a = 10; // 全局作用域
function fn() {
  const b = 20; // fn函数作用域
  function inner() {
    const c = 30; // inner函数作用域
    console.log(a + b + c); // 60:依次向上找a、b
  }
  inner();
}
fn();
(3)变量提升与暂时性死区
  • var:声明提升到作用域顶部,赋值不提升(声明前访问返回undefined);
  • let/const:无变量提升,存在"暂时性死区"(声明前访问报错);
javascript 复制代码
console.log(num1); // undefined(var提升)
var num1 = 10;

console.log(num2); // 报错(let暂时性死区)
let num2 = 20;
(4)词法作用域(静态作用域)

作用域在编写阶段确定,而非执行阶段------函数的作用域由定义位置决定,而非调用位置:

javascript 复制代码
const x = 10;
function fn() {
  console.log(x); // 找定义时的全局x,而非调用时的x
}
function outer() {
  const x = 20;
  fn(); // 输出10
}
outer();
相关推荐
竹林8183 小时前
Solana DApp 开发踩坑实录:从零用 @solana/web3.js 实现链上数据查询与交易签名
前端·javascript
梯度不陡3 小时前
Signal #17:Agent 开始进入组织系统
前端·javascript
胡萝卜术3 小时前
从暴力到Z字形消元:力扣240「搜索二维矩阵II」的降维打击之路
前端·javascript·面试
云浪4 小时前
前端二进制数组完全指南:ArrayBuffer、TypedArray、DataView 一次讲透
前端·javascript
铁皮饭盒5 小时前
26年bunjs, elysia+pg一把梭, redis都省了
前端·javascript·后端
kyriewen18 小时前
别再对着 TypeScript 报错发呆了:我把 10 个最常见的红色波浪线翻译成了人话
前端·javascript·typescript
free3519 小时前
从 0 实现一个 Tiny JavaScript VM:项目架构拆解
javascript
徐小夕21 小时前
我们开源了一款“框架无关”的思维导图编辑器,3分钟集成到任意系统
前端·javascript·github
PBitW21 小时前
GPT训练我的第三天,明白了应该咋说满分回答!😕😕😕
前端·javascript·面试
像我这样帅的人丶你还21 小时前
Java 后端详解(四):分页与搜索
java·javascript·后端