JavaScript加强篇——第八章 高效渲染与正则表达式
目录
一、高效数据渲染
二、map() 方法详解
三、join() 方法详解
四、正则表达式基础
五、正则表达式语法
六、元字符概念
本章聚焦 JavaScript 进阶知识,先围绕高效数据渲染展开,深入解析 map()
方法在数据处理映射、join()
方法在数组转字符串拼接的妙用;随后开启正则表达式学习之旅,从基础概念入手,讲解语法规则,剖析元字符等核心构成,助力读者掌握数据处理与文本匹配的关键技能 。
一、高效数据渲染
传统方式的问题
使用
innerHTML +=
反复追加元素会导致:
频繁重绘和回流(性能差)
原有事件监听失效
代码可读性低
高效渲染四步法
// 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);}
});
⚠️ 关键优势
-
性能优化:单次DOM操作代替多次操作
-
内存高效:减少临时字符串创建
-
代码简洁:逻辑清晰易维护
二、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[3-9]\d{9}$/
-
邮箱验证:
/^\w+@\w+\.\w+$/
-
提取HTML标签内容:
/<div>(.*?)<\/div>/
-
过滤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); // "这个产品真是**,太**了!"
📚 学习资源
-
MDN 正则表达式指南
-
正则表达式在线测试工具
-
正则可视化工具
✅ 核心要点总结
📝 高频面试题速答
-
Q:map()和forEach()的区别?
A:map()返回新数组,forEach()不返回值
-
Q:join()方法的参数作用?
A:指定元素间的连接符,默认是逗号
-
Q:正则表达式的两种定义方式?
A:字面量
/pattern/
和构造函数new RegExp('pattern')
-
Q:test()和exec()的区别?
A:test()返回布尔值,exec()返回匹配详情数组
-
Q:\d 和 \D 分别匹配什么?
A:\d匹配数字,\D匹配非数字
🧠 记忆口诀
"渲染两步走,正则三元配"
两步走:map处理 → join拼接
三元配:匹配、提取、替换