[ PROMPT_NODE_25220 ]
js-length-check-first
[ SKILL_DOCUMENTATION ]
## 数组比较时优先检查长度
当使用昂贵的操作(排序、深度相等、序列化)比较数组时,请先检查长度。如果长度不同,数组必然不相等。
在实际应用中,这种优化在热点路径(事件处理程序、渲染循环)中尤为重要。
**错误做法(即使长度不同也会运行昂贵的比较):**
typescript
function hasChanges(current: string[], original: string[]) {
// 即使长度不同,也会执行排序和连接
return current.sort().join() !== original.sort().join()
}
即使 `current.length` 为 5 而 `original.length` 为 100,也会运行两次 O(n log n) 的排序。此外,连接数组和比较字符串也会产生开销。
**正确做法(优先进行 O(1) 的长度检查):**
typescript
function hasChanges(current: string[], original: string[]) {
// 如果长度不同,尽早返回
if (current.length !== original.length) {
return true
}
// 仅在长度匹配时才进行排序/连接
const currentSorted = current.toSorted()
const originalSorted = original.toSorted()
for (let i = 0; i < currentSorted.length; i++) {
if (currentSorted[i] !== originalSorted[i]) {
return true
}
}
return false
}
这种新方法更高效,因为:
- 避免了长度不同时排序和连接数组的开销
- 避免了为连接后的字符串分配内存(对于大数组尤为重要)
- 避免了修改原始数组
- 在发现差异时尽早返回