1

当一个对象被传递给一个函数时,该对象是按值传递的(尽管对象的值是一个引用)。我将非常大的对象传递到我的函数中,但只能从函数内部访问少数属性(6-12)。内存方面,只传递属性而不是整个对象会更好吗?或者如果我的属性是字符串,这实际上会产生更多的内存问题吗?

给定下面的两个函数,内存会发生什么?在 f1 中,javascript/v8 是在内存中创建一个新对象 foo 还是真的只是一个指针?如果我访问字符串属性,它是否仍然只是一个指针,或者 V8 然后制作该字符串的副本以在函数中使用。在 f2 中,我假设为函数制作了字符串 foo 的全新副本。这是一个正确的假设吗?

function f1(x) {
  var y = x.foo;
}

function f2(foo) {
  var y = foo;
}

var obj = {foo: "test"};
f1(obj);
f2(obj.foo);
4

1 回答 1

1

“在内存方面,只传递属性而不是整个对象会更好吗?或者如果我的属性是字符串,这实际上会产生更多的内存问题吗?”

那将需要更多的内存。它们是否是字符串并不重要,因为字符串通常也是作为引用类型实现的,但是对于每个参数,都会有一个值的副本,而不仅仅是 Object 引用的一个副本。

对象引用的重量非常轻,因此您只需复制它而不是对象的所有单个成员。

此外,如果您依赖函数内对象的突变,这将是必需的。


在您的示例中,只有一个属性被传递(a string)。如果您的代码不依赖于对象本身的突变,那么两者之间将没有显着差异。

在传递对象的示例中,唯一的副本是对象引用。它不是指针,但重量很轻,没有什么可担心的。

在传递字符串的示例中,它似乎复制了整个字符串,但由于字符串在 JavaScript 中是不可变的,因此实现通常也将它们实现为引用类型。

因此,传递单个字符串与传递 10,000 个字符串一样有效。

于 2012-10-18T19:36:38.100 回答