目录
[二、map() 方法详解](#二、map() 方法详解)
[三、join() 方法详解](#三、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); // "这个产品真是**,太**了!"
📚 学习资源
✅ 核心要点总结

📝 高频面试题速答
-
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拼接
三元配:匹配、提取、替换