我目前正在构建一个小型应用程序,它是VanillaJS(没有任何依赖项,如lodash/jquery),我需要比较两个对象,以检查键和值是否相等。我只是想知道如何优化这个问题。
两个对象的键的顺序相同,因为它们是从同一方法派生的。根据这个答案,最快、最有效的方法是使用JSON.stringify(object1) === JSON.stringify(object2)
。
然而,在我的应用程序中,如果这两个对象不相等,那么我会循环遍历其中两个对象并执行一些操作。问题是,这些操作的性能相当繁重,而且偶尔会运行。我需要优化我的解决方案。
因此,我想知道JSON.stringify
是否也在内部运行某种for
循环。在我的应用程序中,这两个对象更有可能不相等。因此,如果JSON.stringify
也运行某种for
循环,我可以立即删除检查并运行我需要的操作(这只会在两个对象不相等的情况下导致程序的差异),从而节省时间并使其更加优化。如果我不这样做,那么从技术上讲,当两个对象不相等时,我将运行两个完全相同的for
循环,而当两个物体相等时,无论哪种方式,我都将运行一个for
循环。如果JSON.stringify
在内部是某种for
循环,那么无论对象是否相等,我都只能有一个for
循环。我在这里说得通吗?如果你不明白什么,请告诉我。这个检查没用吗?我应该删除它来优化我的代码吗?
您的问题涉及4个不同领域:
JSON.stringify
的实现(以及性能)- 对象迭代的实现(以及性能)
- JIT编译器的质量和性能
- 内存分配的速度(
JSON.stringify
是大对象的内存占用者)
所以很明显,现在所有JS引擎和操作系统都有了"通用"的答案。
我建议你检查你的密码。。。为什么?
- 虽然现在属性的顺序可能是不变的,但未来对代码库的维护可能会改变这一点,并引入一个难以追踪的错误
- 最好为您使用的所有对象类型创建一个
isEqual
方法 - 它可读性更好
当然也有缺点:
- 您的代码将变得更大(这可能会链接到可读性更好的地方)
- 其他我可能都忘了