1

オブジェクトが関数に渡される場合、オブジェクトは値によって渡されます (ただし、オブジェクトの値は参照です)。非常に大きなオブジェクトを関数に渡していますが、関数内から少数のプロパティ (6 ~ 12) にしかアクセスしていません。メモリ的には、オブジェクト全体ではなくプロパティのみを渡す方がよいでしょうか? または、プロパティが文字列の場合、これにより実際にメモリの問題がさらに発生しますか?

以下の 2 つの関数を考えると、メモリ単位で何が起こるでしょうか? 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

「メモリに関しては、オブジェクト全体ではなくプロパティのみを渡すほうがよいでしょうか?それとも、プロパティが文字列の場合、実際にはメモリの問題がさらに発生しますか?」

それにはより多くのメモリが必要になります。文字列は一般に参照型としても実装されるため、文字列であるかどうかは問題ではありませんが、引数ごとに、オブジェクト参照の単一のコピーではなく、値のコピーが存在します。

オブジェクト参照は非常に軽量であるため、オブジェクトのすべての個々のメンバーではなく、それをコピーするだけです。

また、関数内のオブジェクトのミューテーションに依存する場合、これが必要になります。


あなたの例では、渡されるプロパティは 1 つだけです(文字列)。コードがオブジェクト自体の変更に依存していない場合、両者の間に大きな違いはありません。

オブジェクトを渡す例では、唯一のコピーはオブジェクト参照です。ポインターではありませんが、非常に軽量で、心配する必要はありません。

文字列を渡す例では、文字列全体のコピーを作成しているように見えますが、文字列は JavaScript では不変であるため、実装では通常、文字列も参照型として実装されます。

したがって、単一の文字列を渡すことは、10,000 文字の文字列を渡すことと同じくらい効率的です。

于 2012-10-18T19:36:38.100 に答える