当前位置: 首页 > news >正文

JavaScript加强篇——第八章 高效渲染与正则表达式

目录

一、高效数据渲染

二、map() 方法详解

三、join() 方法详解

四、正则表达式基础

五、正则表达式语法

六、元字符概念


本章聚焦 JavaScript 进阶知识,先围绕高效数据渲染展开,深入解析 map() 方法在数据处理映射、join() 方法在数组转字符串拼接的妙用;随后开启正则表达式学习之旅,从基础概念入手,讲解语法规则,剖析元字符等核心构成,助力读者掌握数据处理与文本匹配的关键技能 。

一、高效数据渲染

传统方式的问题

使用 innerHTML += 反复追加元素会导致:

  1. 频繁重绘和回流(性能差)

  2. 原有事件监听失效

  3. 代码可读性低

高效渲染四步法

// 1. 获取数据(从本地存储或API)
const students = JSON.parse(localStorage.getItem('students')) || [];// 2. 使用map生成HTML字符串数组
const htmlArray = students.map(student => {return `<tr><td>${student.id}</td><td>${student.name}</td><td>${student.score}</td></tr>`;
});// 3. 使用join拼接完整HTML
const tbody = document.querySelector('tbody');
tbody.innerHTML = htmlArray.join('');// 4. 添加事件监听(使用事件委托)
tbody.addEventListener('click', function(e) {if(e.target.tagName === 'TD') {console.log('点击了学生:', e.target.parentElement.children[1].textContent);}
});

⚠️ 关键优势

  1. 性能优化:单次DOM操作代替多次操作

  2. 内存高效:减少临时字符串创建

  3. 代码简洁:逻辑清晰易维护


二、map() 方法详解

核心概念

map() 遍历数组处理数据,返回新数组(不改变原数组)

语法结构

const newArray = array.map(function(currentValue, index, arr) {// 返回处理后的元素
});
参数说明
currentValue当前元素值
index当前元素索引
arr原始数组(可选)

应用示例

// 1. 数字数组转换
const prices = [100, 200, 300];
const salePrices = prices.map(price => price * 0.8);
console.log(salePrices); // [80, 160, 240]// 2. 对象数组提取
const users = [{id: 1, name: 'John'},{id: 2, name: 'Alice'}
];
const names = users.map(user => user.name);
console.log(names); // ['John', 'Alice']// 3. 添加DOM元素
const colors = ['red', 'green', 'blue'];
const colorDivs = colors.map(color => {const div = document.createElement('div');div.className = 'color-box';div.style.backgroundColor = color;return div;
});
document.body.append(...colorDivs);

❗ 与 forEach 的区别

方法返回值是否改变原数组适用场景
map()新数组数据转换处理
forEach()undefined单纯遍历执行操作

三、join() 方法详解

核心功能

将数组所有元素连接成单个字符串

语法结构

array.join(separator);
参数说明默认值
separator元素间分隔符(可选)逗号,

应用示例

// 1. 基础拼接
const fruits = ['苹果', '香蕉', '橙子'];
console.log(fruits.join());      // "苹果,香蕉,橙子"
console.log(fruits.join('-'));   // "苹果-香蕉-橙子"
console.log(fruits.join(''));    // "苹果香蕉橙子"// 2. 渲染表格行
const rows = ['<tr><td>A01</td><td>90</td></tr>','<tr><td>A02</td><td>85</td></tr>'
];
document.querySelector('tbody').innerHTML = rows.join('');// 3. 生成CSS类名
const btnClasses = ['btn', 'btn-primary', 'btn-lg'];
const className = btnClasses.join(' ');
console.log(className); // "btn btn-primary btn-lg"

性能对比

// 低效方式(大量字符串拼接)
let html = '';
for(let i=0; i<1000; i++) {html += `<div>Item ${i}</div>`; // 每次创建新字符串
}// 高效方式(数组join)
const items = [];
for(let i=0; i<1000; i++) {items.push(`<div>Item ${i}</div>`);
}
document.body.innerHTML = items.join('');

四、正则表达式基础

什么是正则表达式?

正则表达式(Regular Expression):用于匹配字符串中字符组合的模式

三大核心应用

应用场景说明示例
表单验证验证输入格式用户名:/^[a-z0-9_]{3,16}$/
敏感词过滤替换违规内容str.replace(/敏感词/g, '***')
数据提取从文本提取特定信息提取URL中的域名

实际应用场景

  1. 手机号验证:/^1[3-9]\d{9}$/

  2. 邮箱验证:/^\w+@\w+\.\w+$/

  3. 提取HTML标签内容:/<div>(.*?)<\/div>/

  4. 过滤SQL注入关键词:/(select|insert|delete)/i


五、正则表达式语法

两种定义方式

// 1. 字面量方式(推荐)
const reg1 = /前端/;// 2. 构造函数方式
const reg2 = new RegExp('前端');

检测方法

方法返回值适用场景
test()布尔值检查是否匹配
exec()数组/null获取匹配详细信息

test() 方法

const str = 'Web前端开发是IT热门方向';
const reg = /前端/;console.log(reg.test(str)); // true// 实际应用:表单验证
const phoneReg = /^1[3-9]\d{9}$/;
const isValid = phoneReg.test('13800138000');
console.log(isValid); // true

exec() 方法

const str = 'JS前端开发,Python后端开发';
const reg = /开发/;const result = reg.exec(str);
console.log(result);
/* 输出:
['开发',         // 匹配结果index: 3,      // 匹配位置input: 'JS前端开发,Python后端开发',  // 原始字符串groups: undefined
]
*/// 循环获取所有匹配
while ((result = reg.exec(str)) !== null) {console.log(`在位置 ${result.index} 找到:${result[0]}`);
}
/* 输出:
在位置 3 找到:开发
在位置 12 找到:开发
*/

六、元字符概念

普通字符 vs 元字符

类型说明示例
普通字符匹配自身a 匹配 "a"
元字符有特殊含义的字符\d 匹配数字

常用元字符速查表

元字符说明等效表达式
\d匹配数字[0-9]
\D匹配非数字[^0-9]
\w匹配字母数字下划线[a-zA-Z0-9_]
\W匹配非字母数字下划线[^\w]
\s匹配空白符(空格/制表等)[\t\r\n]
\S匹配非空白符[^\s]
.匹配除换行外的任意字符-
^匹配字符串开头-
$匹配字符串结尾-

元字符应用示例

// 1. 匹配手机号
const phoneReg = /^1[3-9]\d{9}$/;// 2. 匹配邮箱
const emailReg = /^\w+@\w+\.\w+$/;// 3. 提取日期
const dateStr = '2023-12-31';
const dateReg = /(\d{4})-(\d{2})-(\d{2})/;
const match = dateReg.exec(dateStr);
console.log(`年: ${match[1]}, 月: ${match[2]}, 日: ${match[3]}`); 
// 年: 2023, 月: 12, 日: 31// 4. 替换敏感词
const content = '这个产品真是垃圾,太差劲了!';
const filtered = content.replace(/垃圾|差劲/g, '**');
console.log(filtered); // "这个产品真是**,太**了!"

📚 学习资源

  1. MDN 正则表达式指南

  2. 正则表达式在线测试工具

  3. 正则可视化工具


✅ 核心要点总结

📝 高频面试题速答

  1. Q:map()和forEach()的区别?

    A:map()返回新数组,forEach()不返回值

  2. Q:join()方法的参数作用?

    A:指定元素间的连接符,默认是逗号

  3. Q:正则表达式的两种定义方式?

    A:字面量 /pattern/ 和构造函数 new RegExp('pattern')

  4. Q:test()和exec()的区别?

    A:test()返回布尔值,exec()返回匹配详情数组

  5. Q:\d 和 \D 分别匹配什么?

    A:\d匹配数字,\D匹配非数字


🧠 记忆口诀

"渲染两步走,正则三元配"

  • 两步走:map处理 → join拼接

  • 三元配:匹配、提取、替换

http://www.lryc.cn/news/587434.html

相关文章:

  • vue防内存泄漏和性能优化浅解
  • PHP语法高级篇(二):文件处理
  • 小架构step系列13:测试用例的加载
  • python的平安驾校管理系统
  • C# 接口(接口可以继承接口)
  • MySQL SQL语句精要:DDL、DML与DCL的深度探究
  • 大模型-量化技术
  • mmap映射文件
  • mapstruct与lombok冲突原因及解决方案
  • Java面试基础:面向对象(2)
  • 利用 MySQL 进行数据清洗
  • System.getenv()拿不到你配置的环境变量
  • 流程控制:从基础结构到跨语言实践与优化
  • IP 地址与网络基础全面解析
  • AI驱动的软件工程(中):文档驱动的编码与执行
  • 【前端知识】移动端APP原生应用与H5交互底层逻辑
  • C#接口进阶:继承与多态实战解析
  • 高压空气冲击炮cad【3张】三维图+设计说明书
  • AutoDL挂载阿里云OSS
  • 01.深入理解 Python 中的 if __name__ == “__main__“
  • 自动润滑系统:从 “盲目养护“ 到智能精注的工业运维革命
  • MD5算法深度剖析与可视化解析
  • MailSpring
  • C++--unordered_set和unordered_map的使用
  • 基于 STM32H743VIT6 的边缘 AI 实践:猫咪叫声分类 CNN 网络部署实战(已验证)中一些bug总结
  • Linux的 iproute2 配置:以太网(Ethernet)、绑定(Bond)、虚拟局域网(VLAN)、网桥(Bridge)笔记250713
  • python3的可变参数如何传递元组和字典
  • 第七章 算法题
  • 016_Token计数与成本管理
  • python:使用openpyxl库,实现excel表格的创建、查询(读取)、修改、插入数据