gpt4 book ai didi

Javascript对象函数参数性能

转载 作者:数据小太阳 更新时间:2023-10-29 03:49:17 24 4
gpt4 key购买 nike

我阅读了一些关于当参数是对象时 javascript 函数参数传递如何工作的线程;我注意到传递方法有很多混淆,至少在术语上是这样:按引用传递、按复制引用传递等等。这个问题不是关于这个传递方法如何命名,或者它在内部是如何工作的,而是涉及对这个问题的某种回答。

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

由于在函数中改变对象的属性会改变外部作用域中的对象,但改变对象本身不会,我认为函数内部用于存储和“引用”参数的内存不依赖于它的大小,因为对象好像没有被复制,但是我需要确定一下。

抱歉我的英语解释不好!

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

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

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

最佳答案

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

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

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

编辑:

对于用例 1,唯一的区别在于从具有更多属性的对象访问属性。在几个或多个中定位属性的区别很小,您将看到的唯一实际区别来自这样一个事实,即在循环遍历对象时必须将对象带入内存缓存,但这与传递它们无关到一个函数。

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

关于Javascript对象函数参数性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25832149/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com