假设你有一个非常大的JS对象,包含数百万个键/值对,并且你需要迭代它们。 这个 jsPerf示例展示了主要的方法,并概述了它们之间的速度差异。 我想知道的是:与其他循环方法相比,使用
Object.keys()
是否会对内存产生不同的影响,因为它需要先创建包含所有对象键的“索引”数组? 源代码中是否有任何优化可以防止这种情况发生?Object.keys()
是否会对内存产生不同的影响,因为它需要先创建包含所有对象键的“索引”数组? 源代码中是否有任何优化可以防止这种情况发生?问题在于Object Keys将for..in与hasOwn属性结合起来,因此根据您的最终目标,它们可以是互斥的或可互换的。至于您看到的基准测试,这完全取决于引擎实现。请查看此答案以获取更多信息
Object.keys()
的实现细节的?你看过源代码吗?我猜想如果内部使用for...in
和hasOwnProperty()
,那么性能差异不会那么大。 - Pensierinmusica
Object.keys()
仍然需要复制对象键占用的空间,以便返回包含它们的数组,对吗? - Pensierinmusicafor...in
与hasOwnProperty()
匹配仅非继承属性会为每个键创建一个函数,从而增加内存消耗并大大降低性能。 - imelgratObject.keys()
仍然返回一个数组,并且该数组需要存储在某个地方。对象键是字符串,因此按值传递(如果您修改返回的数组中的元素,则不会触及原始对象键)。据我理解,这意味着在调用该方法时,对象键的内存使用将被复制。 - Pensierinmusica