面试题答案
一键面试ES6 数组迭代方法实现
// 假设数组元素是对象,对象有属性prop1和prop2
// prop1需要满足正则表达式,prop2需要大于某个阈值
const largeArray = Array.from({ length: 100000 }, (_, i) => ({ prop1: `value${i}`, prop2: i }));
const regex = /pattern/;
const threshold = 50000;
const resultES6 = largeArray.filter(element => {
return regex.test(element.prop1) && element.prop2 > threshold;
});
原生循环实现
const largeArray = Array.from({ length: 100000 }, (_, i) => ({ prop1: `value${i}`, prop2: i }));
const regex = /pattern/;
const threshold = 50000;
const resultLoop = [];
for (let i = 0; i < largeArray.length; i++) {
const element = largeArray[i];
if (regex.test(element.prop1) && element.prop2 > threshold) {
resultLoop.push(element);
}
}
选择方案的原因
- ES6数组迭代方法:
- 可读性:使用
filter
方法代码简洁明了,直接表达了筛选数组元素的意图,提高了代码的可读性和可维护性。 - 性能:虽然
filter
方法内部也是循环实现,但它利用了JavaScript引擎的优化,并且现代引擎在处理数组迭代方法时进行了高度优化,性能接近原生循环。
- 可读性:使用
- 原生循环:
- 性能:原生
for
循环在理论上有潜在的性能优势,因为它没有额外的函数调用开销,直接操作数组索引。然而,在现代JavaScript引擎中,这种优势并不显著,尤其是在处理复杂逻辑时。 - 灵活性:原生循环提供了最大的灵活性,可以在循环体中执行任意复杂的逻辑,并且可以根据需要提前终止循环。但在本题简单的筛选场景下,
filter
方法已经足够。
- 性能:原生
综合来看,在现代JavaScript开发中,为了代码的可读性和维护性,优先使用ES6数组迭代方法,同时其性能也能满足大部分场景的需求。