ホームページ >ウェブフロントエンド >jsチュートリアル >値渡しと参照渡し、それは重要ですか?

値渡しと参照渡し、それは重要ですか?

Susan Sarandon
Susan Sarandonオリジナル
2025-01-20 18:51:08427ブラウズ

値渡しと参照渡し: 詳しい議論

最初の技術面接で、「値渡しと参照渡しの違いは何ですか?」という質問を受けました。私の答えは、「値渡し」は値を渡し、「参照渡し」は参照を渡します。この答えは基本的であり、表面的ですらありますが、完全に間違っているわけではなく、さらなる説明が必要です。

値の受け渡し: 変数の値がコピーされ、パラメーターとして関数に渡されます。関数は、このコピーされた値を使用してさまざまな操作を実行します。元の変数 の値は変更されません 。 JavaScript や Java を含むほぼすべての既知のプログラミング言語は、値による受け渡しを使用します。

Pass By Value vs. Pass By Reference, Does It Matter?

参照による受け渡し: 参照は、メモリ内の値を指す変数を指します。ポインタと考えてください。これはパラメータとして関数に渡され、パラメータを使用してエイリアス (エイリアス参照) が与えられます。この関数は、値のメモリ位置へのアクセスを提供するこのパラメータを使用してさまざまな操作を実行します。したがって、このパラメータを使用する操作はすべて元の変数の値に影響し、元の変数の値は変更されます。参照渡しを使用するプログラミング言語はわずかです。たとえば、C にはこの機能がありますが、C でもデフォルト モードは値渡しです。

Pass By Value vs. Pass By Reference, Does It Matter?

値を渡す例:

次の例では JavaScript を使用しています。これは、プリミティブ型であるか参照型 (オブジェクト) であるかに関係なく、値の受け渡しに厳密に従います。以下はスワップ関数の典型的な例です:

<code class="language-javascript">const firstPrimitive = 1; //传递给firstArgument的原始值
const secondPrimitive = 2; //传递给secondArgument的原始值

const firstObject = {name: "first", reason: "Test pass-by-value"}; //传递给firstArgument的对象
const secondObject = {name: "second", reason: "Test pass-by-value"}; //传递给secondArgument的对象

function swap(firstArgument, secondArgument){
    const placeholder = secondArgument;
    secondArgument = firstArgument;
    firstArgument = placeholder;

    console.log('当前位于函数内部。');
    console.log('firstArgument = ', firstArgument, ', secondArgument = ', secondArgument, '\n');
}

console.log('函数执行前。');
console.log('firstPrimitive = ', firstPrimitive, ', secondPrimitive =', secondPrimitive);
console.log('firstObject = ', firstObject, ', secondObject =', secondObject, '\n');

swap(firstPrimitive, secondPrimitive);
console.log('当前位于函数外部。');
console.log('firstPrimitive = ', firstPrimitive, ', secondPrimitive =', secondPrimitive, '\n');

swap(firstObject, secondObject)
console.log('当前位于函数外部。');
console.log('firstObject = ', firstObject, ', secondObject =', secondObject, '\n');</code>

このコードを実行すると、結果は次のようになります:

<code>函数执行前。
firstPrimitive =  1 , secondPrimitive = 2
firstObject =  { name: 'first', reason: 'Test pass-by-value' } , secondObject = { name: 'second', reason: 'Test pass-by-value' }

当前位于函数内部。
firstArgument =  2 , secondArgument =  1

当前位于函数外部。
firstPrimitive =  1 , secondPrimitive = 2

当前位于函数内部。
firstArgument =  { name: 'second', reason: 'Test pass-by-value' } , secondArgument =  { name: 'first', reason: 'Test pass-by-value' }

当前位于函数外部。
firstObject =  { name: 'first', reason: 'Test pass-by-value' } , secondObject = { name: 'second', reason: 'Test pass-by-value' }</code>

swap 関数の内部では 2 つの値が交換されますが、関数の外部では値は同じままであることに注意してください。

参照渡しの例:

次の例は C を使用しており、参照渡しによって実装できます。これは、アドレス演算子 (&) を使用して実現できます。ここでも、スワップ関数のバージョンを使用します:

<code class="language-c++">#include <stdio.h>

void swap(int &i, int &j) {
  int temp = i;
  i = j;
  j = temp;
}

int main(void) {
  int a = 10;
  int b = 20;

  swap(a, b);
  printf("A is %d and B is %d\n", a, b);
  return 0;
}</code>

出力結果は次のとおりです:

<code>A is 20 and B is 10</code>

ここではaとbの値を基準として使用するため変更しています。

概要: 参照渡しは関数が変数のメモリ アドレスを (参照によって) 受け取り、元の変数を直接変更できることを意味しますが、値渡しは変数のコピーを意味します。 value は、元の変数を変更せずに渡されます。

これは重要ですか?

ほとんどのプログラミング言語は値渡しを使用しており、選択肢がないようです。では、これはどのように適用されるのでしょうか?私が見つけたものは次のとおりです:

  • クライアント プログラム用にパラメータを変更せずに、パラメータを単に「使用」して計算を行う場合は、値渡しを使用します。
  • 引数として渡された変数の元の値を変更する関数が必要な場合は、参照渡しを使用します。これは、コピーを作成する代わりに変数のメモリ位置を直接操作するため、特に次のような場合に効率的になります。大きなデータ構造 (複雑なオブジェクトや配列など) を扱うと、データのコピーのオーバーヘッドが回避され、元の変数を関数内で直接変更できるようになります。参照渡しによりパフォーマンスが向上する可能性があります。

コメント歓迎です。ありがとう。

参考資料: JavaScript は参照渡しですか? 参照渡し (C のみ)

以上が値渡しと参照渡し、それは重要ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。