一、正则表达式在文本处理中的应用
1.1 中英文符号转换场景
在数据处理过程中,常遇到JSON字符串中混用中英文标点符号的情况。例如将中文冒号:、引号“”转换为英文符号:、""。此类需求可通过正则表达式高效实现:
function replaceChineseSymbols(str) {return str.replace(/:/g, ':').replace(/“/g, '"').replace(/”/g, '"');}// 测试用例const jsonStr = '{“name”: “张三”, “age”: 20}';console.log(replaceChineseSymbols(jsonStr));// 输出: {"name": "张三", "age": 20}
实现要点:
- 使用
String.prototype.replace()方法配合正则全局匹配标志g - 通过字符类
[]匹配特定符号,避免转义字符干扰 - 建议对用户输入做双重校验,先标准化符号再解析JSON
1.2 复杂文本清洗方案
对于包含多种特殊符号的文本,可构建正则表达式组合:
const symbolMap = {':': ':','“': '"','”': '"',';': ';',',': ','};function advancedReplace(str) {let regex = new RegExp(Object.keys(symbolMap).join('|'), 'g');return str.replace(regex, match => symbolMap[match]);}
二、JavaScript异步编程进阶
2.1 Promise链式调用优化
在处理多个异步操作时,传统回调嵌套会导致”回调地狱”。使用Promise可显著提升代码可读性:
// 模拟异步API调用function fetchData(url) {return new Promise(resolve => {setTimeout(() => resolve(`Data from ${url}`), 1000);});}// 顺序执行fetchData('/api/user').then(data => {console.log(data);return fetchData('/api/orders');}).then(data => console.log(data));
2.2 并行控制最佳实践
当需要同时发起多个异步请求时,Promise.all()是理想选择:
const apiList = ['/api/users', '/api/products', '/api/orders'];Promise.all(apiList.map(url => fetchData(url))).then(results => {const [users, products, orders] = results;console.log({users, products, orders});}).catch(error => console.error('Request failed:', error));
注意事项:
- 某个请求失败会导致整个
Promise.all()被拒绝 - 对关键请求建议单独处理,非关键请求可使用
Promise.allSettled()
2.3 异步生成器实现
对于需要逐步处理大数据流的场景,可使用异步生成器:
async function* streamProcessor(dataStream) {for await (const chunk of dataStream) {const processed = await processChunk(chunk);yield processed;}}// 使用示例(async () => {const stream = getDataStream(); // 获取数据流for await (const data of streamProcessor(stream)) {console.log(data);}})();
三、核心算法实现解析
3.1 两数之和问题
给定数组和目标值,找出相加等于目标值的两个元素索引:
// 双指针解法(适用于已排序数组)function twoSumSorted(numbers, target) {let left = 0, right = numbers.length - 1;while (left < right) {const sum = numbers[left] + numbers[right];if (sum === target) return [left, right];sum < target ? left++ : right--;}return [-1, -1];}// 哈希表解法(通用场景)function twoSum(nums, target) {const map = new Map();for (let i = 0; i < nums.length; i++) {const complement = target - nums[i];if (map.has(complement)) return [map.get(complement), i];map.set(nums[i], i);}return [-1, -1];}
复杂度分析:
- 双指针法:时间复杂度O(n),空间复杂度O(1)
- 哈希表法:时间复杂度O(n),空间复杂度O(n)
3.2 数组反转实现
基础反转算法需注意边界条件处理:
// 原地反转(空间复杂度O(1))function reverseArray(arr) {let left = 0, right = arr.length - 1;while (left < right) {[arr[left], arr[right]] = [arr[right], arr[left]];left++;right--;}return arr;}// 创建新数组(保持原数组不变)function reverseCopy(arr) {const result = [];for (let i = arr.length - 1; i >= 0; i--) {result.push(arr[i]);}return result;}
四、对象操作高级技巧
4.1 对象合并策略
Object.assign()方法存在浅拷贝限制,深拷贝需结合其他方案:
// 浅合并const target = { a: 1 };const source = { b: 2, c: { d: 3 } };Object.assign(target, source);// target变为 {a:1, b:2, c:{d:3}},但c是引用// 深合并实现function deepMerge(target, ...sources) {sources.forEach(source => {for (const key in source) {if (source[key] instanceof Object && !Array.isArray(source[key])) {target[key] = deepMerge(target[key] || {}, source[key]);} else {target[key] = source[key];}}});return target;}
4.2 对象属性遍历顺序
ES6规范定义了对象属性遍历顺序规则:
- 数字键按升序排列
- 字符串键按添加顺序排列
- Symbol键按添加顺序排列
```javascript
const obj = {
2: ‘two’,
a: ‘a’,
1: ‘one’,
b: ‘b’
};
Object.getOwnPropertyNames(obj); // [“1”, “2”, “a”, “b”]
Reflect.ownKeys(obj); // [“1”, “2”, “a”, “b”, Symbol(id)]
### 五、性能优化实践#### 5.1 防抖与节流实现控制高频事件触发的经典方案:```javascript// 防抖函数(最后触发)function debounce(fn, delay) {let timer = null;return function(...args) {clearTimeout(timer);timer = setTimeout(() => fn.apply(this, args), delay);};}// 节流函数(固定频率触发)function throttle(fn, interval) {let lastTime = 0;return function(...args) {const now = Date.now();if (now - lastTime >= interval) {fn.apply(this, args);lastTime = now;}};}
5.2 虚拟列表实现原理
处理长列表渲染性能问题的关键技术:
class VirtualList {constructor(container, options) {this.container = container;this.itemHeight = options.itemHeight;this.visibleCount = Math.ceil(container.clientHeight / this.itemHeight);this.startIndex = 0;this.endIndex = this.visibleCount;// 实际实现需处理滚动事件和DOM更新}}
优化要点:
- 只渲染可视区域内的元素
- 使用绝对定位控制元素位置
- 监听滚动事件动态更新显示范围
本文系统梳理了前端开发中的高频面试考点,通过代码示例和实现原理分析,帮助开发者建立完整的知识体系。掌握这些核心概念不仅能提升面试表现,更能在实际项目中编写出更健壮、高效的代码。建议结合具体业务场景进行实践,加深对技术原理的理解。