English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

JSが値引き渡しか参照引き渡しかを深く理解する(推奨)

値の伝搬(call by value)は最も一般的な評価戦略であり、関数の引数は呼び出されたときに実引数のコピーである。引数の値の変更は実引数に影響を与えない。

  参照の伝搬(call by reference)では、関数の引数は実引数の暗黙的な参照を受け取るが、コピーではなく。これは、関数の引数の値が変更された場合、実引数も変更されることを意味し、両者が同じ値を指すことになる。

  参照の伝搬(call by reference)は、関数呼び出しの追跡をより難しくし、時には微妙なバグを引き起こすこともある。

  値の伝搬は、それぞれのコピーをクローンする必要があるため、一部の複雑な型ではパフォーマンスが低い。両方の値の伝搬方法にはそれぞれの問題がある。

  JSの基本型は、値の伝搬による。

var a = 1;
function foo(x) {
x = 2;
}
foo(a);
console.log(a); // まだ1, 未受x = 2割り当てが影響する

  次に、オブジェクトの引き渡しについて見てみましょう:

var obj = {x : 1};
function foo(o) {
o.x = 3;
}
foo(obj);
console.log(obj.x); // 3, 修正されました! 
var obj = {x : 1};
function foo(o) {
o = 100;
}
foo(obj);
console.log(obj.x); // それでも1, obj は変更されませんでした。100.

  オブジェクトの値引き渡しは参照引き渡しではありません。実際には、シェア引き渡し(call by sharing)と正確に言えば、JSでは基本型は値引き渡し、オブジェクト型はシェア引き渡し(call by sharing、参照引き渡しや参照共有引き渡しとも呼ばれます)。

  この戦略のポイントは、関数に引数を渡す際、関数はオブジェクト引数の参照のコピーを受け取ります(値引き渡しのオブジェクトのコピーではなく、参照引き渡しの暗黙の参照でもありません)。これは参照引き渡しとは異なり、シェア引き渡し(call by sharing)においては、関数の引数に対する割り当てが引数の値に影響を与えません。

  つまり、基本型は値引き渡しであり、オブジェクトの場合、引数にはオブジェクトが指すアドレスが渡されます。これも特別な値引き渡しと考えられます。関数内でオブジェクトの属性に対して操作を行う場合、実際にはそのオブジェクトが指す属性に対して操作を行います。しかし、その全体に対して操作を行う場合(例えば:o =)、 100またはo = [])は、実際には新しいオブジェクトが定義され、引数の参照アドレスは新しいオブジェクトの参照アドレスであり、元の参照とは何の関係もありません。したがって、元のオブジェクトに影響を与えません。

以上で、編集者が皆さんに紹介したJSが値引き渡しであるか、参照引き渡しであるか(推奨)に関する全ての知識を紹介しました。皆さんに役立つことを願っています。何か疑問があれば、コメントを残してください。編集者は皆さんの質問に迅速に回答します。このサイトへのサポートに感謝しています!

声明:この記事の内容はインターネットから取得しており、著作権者に帰属します。インターネットユーザーが自発的に貢献し、自己でアップロードしたものであり、本サイトは所有権を持ちません。人工的な編集は行われていません。また、関連する法的責任を負いません。著作権に疑われる内容が見つかった場合は、メールで notice#w までお知らせください。3codebox.com(メールを送信する際、#を@に変更してください。申し訳ありませんが、報告を行い、関連する証拠を提供してください。一旦確認がとれましたら、本サイトは侵害が疑われる内容をすぐに削除します。)

おすすめ