JavaScript中的Object.keys().forEach()是否比简单的for…In循环内存效率低?

JavaScript中的Object.keys().forEach()是否比简单的for…In循环内存效率低?,javascript,loops,object,ecmascript-5,Javascript,Loops,Object,Ecmascript 5,假设您有一个非常大的JS对象,包含数百万个键/值对,您需要对它们进行迭代 显示了执行此操作的主要方法,并概述了速度差异 我想知道的是:与其他循环方法相比,使用Object.keys()会对内存产生不同的影响,因为它需要先创建包含所有对象键的“索引”数组 源代码中是否有任何优化可以防止这种情况发生?问题是,对象键将for..in与hasOwn属性结合起来,因此根据您的最终目标,它们可以是独占的或可互换的。至于你自己看到的基准测试,一切都取决于引擎的实现。查看此答案以了解更多信息 您所寻找的是对对象

假设您有一个非常大的JS对象,包含数百万个键/值对,您需要对它们进行迭代

显示了执行此操作的主要方法,并概述了速度差异

我想知道的是:与其他循环方法相比,使用
Object.keys()
会对内存产生不同的影响,因为它需要先创建包含所有对象键的“索引”数组


源代码中是否有任何优化可以防止这种情况发生?

问题是,对象键将for..in与hasOwn属性结合起来,因此根据您的最终目标,它们可以是独占的或可互换的。至于你自己看到的基准测试,一切都取决于引擎的实现。查看此答案以了解更多信息


您所寻找的是对对象或数组属性的惰性迭代。这在ES5中是不可能的(因此在许多实现中是不可能的,比如node.js)。我们最终会得到这个


内存方面,两者都
用于。。。在
Object.keys.forEach中
将把整个属性集加载到内存中。每个JS引擎中实际使用的内存量可能会有很大差异。您应该始终在不同的场景下测试代码,并使用多个引擎来确定哪一个最适合您的应用程序。

嗨,Dayan,您如何知道
Object.keys()
的实现细节,您看过源代码了吗?我想如果它在内部使用
for…in
hasOwnProperty()
,那么就不会有这么大的性能差异。不,我没有看到每个JS引擎的源代码,但众所周知,并非所有浏览器都以相同的方式构建JS解释器。因此,对某些人来说可能是正确的,但对另一些人来说可能不是。谢谢伊万!关于这两种方法在内存方面的执行情况,是否已有数据?如果我理解正确,即使两者都将整个集合加载到内存中,
Object.keys()
仍然需要复制对象键占用的空间,以便返回包含它们的数组,对吗?不是这样的,因为Object.keys是本机方法。因此,对于初学者来说,它比其他方法要快得多(在性能方面更优化)。至于内存消耗,这取决于引擎实现(大多数引擎使用hashMap来更快地访问和减少内存)。另外,请注意,使用
for…in
hasOwnProperty()
仅匹配非继承属性会为每个键创建一个函数,从而增加内存消耗并大大降低性能。您好,很抱歉,但是本机或非本机,
Object.keys()
仍返回一个数组,这个数组需要存储在某个地方。对象键是字符串,因此按值传递(如果修改返回数组中的元素,则不会触及原始对象键)。据我所知,这意味着在调用该方法时,对象键的内存使用将重复。关于获取重复键和使用两倍空间的说法是正确的。我的意思是所有迭代器都会导致数据重复。我的意思是Object.keys由于是本机方法而导致内存使用较少,因此,创建密钥数组的过程比其他方法优化得多。如果我没有正确解释自己,我很抱歉。当你说“所有迭代器都会导致数据重复”时,你的确切意思是什么?例如,“for…in”如何迭代对象键?你知道这是如何在源代码中实现的吗?干杯