如何优化JS Window对象条件重置性能适配自动化测试
优化方案:将嵌套循环转为哈希查找(Set)
原代码的核心性能瓶颈在于嵌套循环的O(n*m)时间复杂度——每次判断window属性是否属于默认列表都要遍历整个DEFAULT_WIN_KEYS数组,当两个数组规模较大时,耗时会直线上升。
直接的优化思路是把DEFAULT_WIN_KEYS转为Set结构,利用Set的O(1)查找特性,将整体时间复杂度降至O(n),能直接把耗时压缩到毫秒级。
优化后的代码
// 全局提前初始化Set(只需要执行一次,不用每次reset都创建) const DEFAULT_WIN_SET = new Set(DEFAULT_WIN_KEYS); function resetWindow(){ const ALL_WIN_KEYS = Object.keys(window); for(let i = 0; i < ALL_WIN_KEYS.length; i++){ const key = ALL_WIN_KEYS[i]; if(!DEFAULT_WIN_SET.has(key)){ delete window[key]; } } }
关键优化点
- 预初始化Set:把
DEFAULT_WIN_KEYS转成Set的操作只需要在全局执行一次,避免每次调用resetWindow时重复创建,进一步节省开销。 - O(1)查找:Set的
has方法比数组遍历快几个数量级,尤其当DEFAULT_WIN_KEYS元素较多时,性能提升更明显。 - 保留高效的传统for循环:你已经验证过传统for循环是最快的遍历方式,这里继续沿用,避免引入forEach、for...of等相对较慢的遍历方法。
额外优化建议
- 如果
DEFAULT_WIN_KEYS是固定不变的,建议在页面加载时就完成Set的初始化,不要等到resetWindow调用时才处理。 - 可以提前过滤掉window上不可删除的原生属性(比如
document、location等),避免无效的delete操作,示例:// 提前定义不可删除的原生属性列表(按需补充) const UNDELETABLE_KEYS = new Set(['document', 'location', 'navigator']); function resetWindow(){ const ALL_WIN_KEYS = Object.keys(window); for(let i = 0; i < ALL_WIN_KEYS.length; i++){ const key = ALL_WIN_KEYS[i]; if(!DEFAULT_WIN_SET.has(key) && !UNDELETABLE_KEYS.has(key)){ delete window[key]; } } }
内容的提问来源于stack exchange,提问作者Steffie
相关产品推荐
相关产品推荐

