[ PROMPT_NODE_27952 ]
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
}
这种新方法更高效,因为:
- 当长度不同时,避免了排序和连接数组的开销
- 避免了为连接后的字符串分配内存(对于大数组尤为重要)
- 避免了修改原始数组
- 在发现差异时会提前返回