Javascript对象的函数参数性能

时间:2014-09-14 10:07:04

标签: javascript performance function object

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

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

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

很抱歉我的英语很难解释!

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

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

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

2 个答案:

答案 0 :(得分:8)

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

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

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

编辑:

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

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

答案 1 :(得分:4)

请看这个答案:

Pass Variables by Reference in Javascript

简单来说,您的对象通过引用传递""从性能的角度来看,使用大型或小型对象调用函数应该没有区别。

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

对于函数调用的执行,专门采用,应该没有区别。