JavaScript中长字符串相等比较耗时更长的原因是什么
该现象的核心原因
- 你对V8引擎的字符串驻留(string interning)机制适用范围存在误解:V8不会对所有动态生成的字符串自动做驻留优化,仅字符串字面量、用作对象属性键的字符串、高频重复使用的短字符串才会触发自动驻留。你代码中通过循环拼接UUID生成的随机长字符串属于一次性动态生成的非复用内容,不会被驻留,自然享受不到「仅比较指针/驻留ID即可判断相等」的优化。
- 未驻留的字符串执行
===全等比较的逻辑为:- 先对比两个字符串的长度,长度不同直接返回false
- 长度一致时,逐字符对比字符串的全部内容,所有字符匹配才返回true
你的两次测试中,待比较的字符串长度为3倍关系,且数组内所有字符串和目标查找字符串长度完全一致,跳过了第一步快速返回的逻辑,只能逐字符对比;同时你使用filter会遍历全部100万条数据,所有比较都需要执行完成,总耗时自然和字符串长度成正比,和你实测的3倍耗时完全吻合。
驻留效果验证方式
如果想要验证驻留优化的效果,可以在生成每个字符串后手动触发驻留逻辑,比如新增一行void {}[id](将字符串作为对象属性键使用时,V8会对这类字符串自动驻留),再执行比较测试,此时两次运行的耗时差异会基本消失。
内容的提问来源于stack exchange,提问作者user7858768
相关产品推荐
相关产品推荐

