Javascript对象的函数参数性能

Nil*_*lus 9 javascript performance function object

我读了一些关于当参数是对象时javascript函数参数传递如何工作的线程; 我注意到传递方法存在很多混淆,至少在术语中:传递引用,传递复制引用等等.这个问题不是关于如何命名这个传递方法,或者它如何在里面工作,而是以某种方式回答这个问题.

我有一些大的,非常大的对象,作为参数传递给函数; 我需要了解对象传递是否意味着对象的一些副本,因此内存消耗,计算工作量,内存泄漏风险与传递的对象的大小成正比,对于每个函数调用(我有很多调用),或者如果它以非尺寸比例的后果方式传递.

由于改变函数中对象的属性会改变外部作用域中的对象,但改变对象本身不会,我认为函数内部用于存储和"引用"参数的内存不依赖于它的大小,因为对象似乎不被复制,但我需要确定它.

对不起我的英语解释不好!

编辑:答案在某种程度上涉及对JS传递模式的洞察,但核心问题是实际案例的性能改进,因此任何理论信息都很有用,但所需的最重要信息是关于计算和内存消耗.

用例1(性能):假设我有一个访问其参数的两个成员的函数,并将一些结果写入第三个,在1000个不同的对象上执行1000次.问题是:如果对象由所涉及的仅3个属性组成,并且如果它具有其他100个属性,则hypotetical循环将花费几乎相同的时间?任何差异只会由参数复制开销或选择较大对象内的属性引起?实际测试可能在很大程度上取决于浏览器,所以我需要技术,通用的有效答案.

用例2:我有100MB对象,传递给一个函数.在执行期间,我的内存占用增加了100MB吗?因此,例如由错误控制的外壳引入的任何内存泄漏都更加危险.

Guf*_*ffa 8

简短的回答是不复制对象,只是对对象的引用作为参数传递.

更准确的答案是,在Javascript中,所有参数都按值传递.对于像数字这样的简单类型,这意味着要复制该值.对于对象意味着复制对象的引用.

如您所知,参数本身是一个独立的副本,但该参数指向与您在函数调用中使用的变量相同的对象.

编辑:

对于用例1,唯一的区别来自于从具有更多属性的对象访问属性.在少数或多个属性中定位属性的区别很小,您将看到的唯一实际差异来自于在循环它们时必须将对象引入内存高速缓存这一事实,但这与传递它们无关一个功能.

对于用例2,没有对象的重复,该对象在内存中仅存在一次.


lex*_*ore 6

请看这个答案:

在 Javascript 中通过引用传递变量

简而言之,您的对象是“通过引用”传递的,从性能的角度来看,使用大对象或小对象调用函数应该没有区别。

话虽如此,整体性能取决于功能。它可以复制对象、执行 AJAX 调用等,所有这些都可能会或可能不会根据对象的大小执行不同的操作。

对于函数调用的性能,单独来看,应该没有区别。