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

目录

一、高效数据渲染

[二、map() 方法详解](#二、map() 方法详解)

[三、join() 方法详解](#三、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拼接

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

相关推荐
三原10 分钟前
7000块帮朋友做了2个小程序加一个后台管理系统,值不值?
前端·vue.js·微信小程序
popoxf19 分钟前
在新版本的微信开发者工具中使用npm包
前端·npm·node.js
爱编程的喵1 小时前
React Router Dom 初步:从传统路由到现代前端导航
前端·react.js
阳火锅1 小时前
Vue 开发者的外挂工具:配置一个 JSON,自动造出一整套页面!
javascript·vue.js·面试
每天吃饭的羊1 小时前
react中为啥使用剪头函数
前端·javascript·react.js
源代码•宸1 小时前
C++高频知识点(十三)
开发语言·c++·经验分享·面经
wa的一声哭了1 小时前
python基础知识pip配置pip.conf文件
java·服务器·开发语言·python·pip·risc-v·os
Nicholas682 小时前
Flutter帧定义与60-120FPS机制
前端
多啦C梦a2 小时前
【适合小白篇】什么是 SPA?前端路由到底在路由个啥?我来给你聊透!
前端·javascript·架构
薛定谔的算法2 小时前
《长安的荔枝·事件流版》——一颗荔枝引发的“冒泡惨案”
前端·javascript·编程语言