【发布时间】:2014-11-08 00:59:28
【问题描述】:
我阅读了一些关于当参数是对象时 javascript 函数参数传递如何工作的线程;我注意到在传递方法上有很多混淆,至少在术语上是这样的:pass-by-reference、pass-by-copy-reference 等等。 这个问题不是关于这个传递方法是如何命名的,或者它是如何在内部工作的,而是涉及到这个问题的某种答案。
我有一些非常大的对象,要作为参数传递给函数;我需要了解对象传递是否意味着对象的某些副本,因此内存消耗、计算量、内存泄漏风险与传递的对象的大小成正比,对于每个函数调用(我有很多调用),或者如果它以非大小比例的后果方式传递。
由于在函数中更改对象的属性会更改外部范围内的对象,但更改对象本身不会,因此我认为函数内部用于存储和“引用”参数的内存不取决于其大小,因为该对象似乎没有被复制,但我需要确定它。
对不起,我的英语解释得不好!
编辑:答案在某种程度上涉及对 JS 传递模式的洞察,但核心问题是实际案例的性能提升,所以任何理论信息都有用,但最重要的信息是关于计算和内存消耗.
用例 1(性能):假设我有一个函数访问其参数的两个成员,并在第三个成员上写入一些结果,在 1000 个不同的对象上执行 1000 次。问题是:如果对象仅由所涉及的 3 个属性组成,并且如果它具有其他 100 个属性,则假设循环将花费几乎相同的时间?仅由参数复制开销或通过选择较大对象内的属性会导致任何差异吗? 实际测试可能很大程度上取决于浏览器,因此我需要对此进行技术性、通用有效的回答。
用例 2:我有 100MB 的对象,传递给一个函数。在执行期间,我的内存占用增加了 100MB 吗?因此,任何引入的内存泄漏,例如由控制不当的外壳引起的,都更加危险。
【问题讨论】:
-
在 javascript 中,所有复杂类型都是通过引用传递的,因此您将在函数内部进行的所有修改都将使用原始对象 => 复制不会产生额外的内存消耗
-
@shershen:现在你混淆了这些概念。参数永远不会通过引用传递,它们是通过值传递的。参数可以是引用,但仍是按值传递。
标签: javascript performance function object