ホームページ ウェブフロントエンド jsチュートリアル JavaScript の値が値によって渡されるか、reference_javascript スキルによって渡されるかについてのディスカッション

JavaScript の値が値によって渡されるか、reference_javascript スキルによって渡されるかについてのディスカッション

May 16, 2016 pm 04:16 PM
javascript

最近、「JS の値は値で渡されるのか、それとも参照で渡されるのか?」という興味深い質問に遭遇しました。

この問題を分析する前に、値による呼び出しと参照による呼び出しとは何かを理解する必要があります。コンピュータサイエンスでは、この部分は評価戦略と呼ばれます。関数を呼び出すときに、変数間、および実パラメータと仮パラメータの間で値がどのように渡されるかを決定します。

値渡し VS. 参照渡し

値による呼び出しは、最も一般的に使用される評価戦略です。関数の仮パラメータは、呼び出し時に渡される実際のパラメータのコピーです。仮パラメータの値を変更しても、実際のパラメータには影響しません。

参照渡し (参照呼び出し) の場合、関数の仮パラメータはコピーではなく実際のパラメータへの暗黙的な参照を受け取ります。これは、関数パラメータの値が変更されると、実際のパラメータも変更されることを意味します。同時に、両方とも同じ値を指します。

参照渡しでは、関数呼び出しのトレースがより困難になり、場合によっては微妙なバグが発生することがあります。

値渡しでは毎回クローンが必要となるため、一部の複雑な型ではパフォーマンスが低下します。値を渡すどちらの方法にも独自の問題があります。

まず、値渡しと参照渡しの違いを理解するために C の例を見てみましょう:

コードをコピー コードは次のとおりです:

void Modify(int p, int * q)
{
p = 27; // 値渡し – p は実際のパラメータ a のコピーであり、p のみが変更されます
*q = 27; // q は b への参照であり、q と b は両方とも変更されます
}
int main()
{
int a = 1;
int b = 1;
Modify(a, &b); // a は値によって渡され、b は参照によって渡されます、
// a は変更されていませんが、b は変更されています
Return(0);
}

ここで次のことがわかります:

a => p が値によって渡される場合、仮パラメータ p の値を変更しても、a の単なるコピーである実際のパラメータ a には影響しません。
b => q は参照によって渡されます。仮パラメータ q の値を変更すると、実パラメータ b の値にも影響します。
JS 値がどのように渡されるかを調べてください
JS の基本的な型は値によって渡されます。

コードをコピー コードは次のとおりです:

var a = 1;
関数 foo(x) {
x = 2;
}
foo(a);
console.log(a); // 1 のままですが、x = 2 の代入の影響を受けません

オブジェクトをもう一度見てみましょう:
コードをコピー コードは次のとおりです:

var obj = {x : 1};
関数 foo(o) {
o.x = 3;
}
foo(obj);
console.log(obj.x); // 3、変更されました!

o と obj は同じオブジェクトであり、o は obj のコピーではないことを説明します。したがって、値によっては渡されません。 しかし、これは JS オブジェクトが参照によって渡されることを意味するのでしょうか?次の例を見てみましょう:
コードをコピー コードは次のとおりです:

var obj = {x : 1};
関数 foo(o) {
o = 100;
}
foo(obj);
console.log(obj.x); // 1 のまま、obj は 100 に変更されていません。

参照によって渡される場合、仮パラメータ o の値を変更すると、実際のパラメータに影響を与えるはずです。ただし、ここで o の値を変更しても、obj には影響しません。 したがって、JS 内のオブジェクトは参照によって渡されません。では、JS でオブジェクトの値はどのように転送されるのでしょうか?

共有による通話

正確に言うと、JS の基本型は値渡しであり、オブジェクト型は共有渡しです (共有呼び出し、オブジェクト渡し、オブジェクト共有渡しとも呼ばれます)。これは、1974 年に Barbara Liskov によって GLU 言語で初めて提案されました。この評価戦略は、Python、Java、Ruby、JS およびその他の言語で使用されます。

この戦略の重要な点は、関数を呼び出してパラメータを渡すとき、関数はオブジェクト引数参照のコピー (値によって渡されるオブジェクトのコピーでも、参照によって渡される暗黙的な参照でもありません) を受け入れることです。 参照渡しとの違いは、共有転送での関数パラメータの割り当てが実際のパラメータの値に影響を与えないことです。次の例のように、仮パラメータ o の値を変更することによって obj の値を変更することはできません。

コードをコピー コードは次のとおりです:

var obj = {x : 1};
関数 foo(o) {
o = 100;
}
foo(obj);
console.log(obj.x); // 1 のまま、obj は 100 に変更されていません。

ただし、参照はコピーですが、参照されるオブジェクトは同じです。これらは同じオブジェクトを共有するため、仮パラメータ オブジェクトのプロパティ値を変更すると、実際のパラメータのプロパティ値にも影響します。
コードをコピー コードは次のとおりです:

var obj = {x : 1};
関数 foo(o) {
o.x = 3;
}
foo(obj);
console.log(obj.x); // 3、変更されました!

オブジェクト タイプの場合、オブジェクトは変更可能であるため、オブジェクト自体を変更すると、オブジェクトを共有する参照および参照コピーに影響します。基本型については、すべて不変であるため、共有渡しと値渡し(値呼び出し)に違いはありません。そのため、JS の基本型は値渡しと共有渡しの両方に準拠します。
コードをコピー コードは次のとおりです:

var a = 1; // 1 は数値型、不変 var b = b = 6;

pass-by-share 評価戦略によれば、a と b は 2 つの異なる参照 (b は a の参照コピー) ですが、同じ値を参照します。ここでの基本型 1 は不変であるため、値による受け渡しと共有による受け渡しに違いはありません。

基本型の不変の性質

基本型は不変(immutable)で、オブジェクトのみが可変(mutable)です。たとえば、数値100、ブール値true、false、これらの値を変更します(たとえば、1を3に変更します)。 true to 100 ) は意味がありません。誤解しやすいのはJSの文字列です。文字列の内容を「変更」しようとする場合がありますが、JS では、文字列値を「変更」するように見える操作は実際には新しい文字列値を作成します。

コードをコピー コードは次のとおりです:

var str = "abc";
str[0] // "a"
; str[0] = “d”;
str; // "abc" の代入はまだ無効です。文字列
の内容を変更する方法はありません。

しかし、オブジェクトは異なり、オブジェクトは変更可能です。
コードをコピー コードは次のとおりです:

var obj = {x : 1};
obj.x = 100;
var o = obj;
o.x = 1;
obj.x; // 1、変更されました
o = true;
obj.x; // 1、o = true
のため変更されません

ここでは変数 obj を定義し、その値は object で、obj.x 属性の値を 100 に設定します。次に、別の変数 o を定義します。その値は依然としてオブジェクト object です。この時点では、2 つの変数 obj と o の値は同じオブジェクトを指します (同じオブジェクトへの参照を共有します)。したがって、オブジェクトの内容を変更すると、obj と o の両方に影響します。ただし、オブジェクトは参照によって渡されません。o の値は o = true によって変更されます。これは obj には影響しません。
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 Dec 17, 2023 pm 02:54 PM

WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 はじめに: 技術の継続的な発展により、音声認識技術は人工知能の分野の重要な部分になりました。 WebSocket と JavaScript をベースとしたオンライン音声認識システムは、低遅延、リアルタイム、クロスプラットフォームという特徴があり、広く使用されるソリューションとなっています。この記事では、WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法を紹介します。

WebSocket と JavaScript: リアルタイム監視システムを実装するための主要テクノロジー WebSocket と JavaScript: リアルタイム監視システムを実装するための主要テクノロジー Dec 17, 2023 pm 05:30 PM

WebSocketとJavaScript:リアルタイム監視システムを実現するためのキーテクノロジー はじめに: インターネット技術の急速な発展に伴い、リアルタイム監視システムは様々な分野で広く利用されています。リアルタイム監視を実現するための重要なテクノロジーの 1 つは、WebSocket と JavaScript の組み合わせです。この記事では、リアルタイム監視システムにおける WebSocket と JavaScript のアプリケーションを紹介し、コード例を示し、その実装原理を詳しく説明します。 1.WebSocketテクノロジー

JavaScript と WebSocket を使用してリアルタイムのオンライン注文システムを実装する方法 JavaScript と WebSocket を使用してリアルタイムのオンライン注文システムを実装する方法 Dec 17, 2023 pm 12:09 PM

JavaScript と WebSocket を使用してリアルタイム オンライン注文システムを実装する方法の紹介: インターネットの普及とテクノロジーの進歩に伴い、ますます多くのレストランがオンライン注文サービスを提供し始めています。リアルタイムのオンライン注文システムを実装するには、JavaScript と WebSocket テクノロジを使用できます。 WebSocket は、TCP プロトコルをベースとした全二重通信プロトコルで、クライアントとサーバー間のリアルタイム双方向通信を実現します。リアルタイムオンラインオーダーシステムにおいて、ユーザーが料理を選択して注文するとき

WebSocketとJavaScriptを使ったオンライン予約システムの実装方法 WebSocketとJavaScriptを使ったオンライン予約システムの実装方法 Dec 17, 2023 am 09:39 AM

WebSocket と JavaScript を使用してオンライン予約システムを実装する方法 今日のデジタル時代では、ますます多くの企業やサービスがオンライン予約機能を提供する必要があります。効率的かつリアルタイムのオンライン予約システムを実装することが重要です。この記事では、WebSocket と JavaScript を使用してオンライン予約システムを実装する方法と、具体的なコード例を紹介します。 1. WebSocket とは何ですか? WebSocket は、単一の TCP 接続における全二重方式です。

JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 Dec 17, 2023 pm 05:13 PM

JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 はじめに: 今日、天気予報の精度は日常生活と意思決定にとって非常に重要です。テクノロジーの発展に伴い、リアルタイムで気象データを取得することで、より正確で信頼性の高い天気予報を提供できるようになりました。この記事では、JavaScript と WebSocket テクノロジを使用して効率的なリアルタイム天気予報システムを構築する方法を学びます。この記事では、具体的なコード例を通じて実装プロセスを説明します。私たちは

JavaScriptでinsertBeforeを使用する方法 JavaScriptでinsertBeforeを使用する方法 Nov 24, 2023 am 11:56 AM

使用法: JavaScript では、insertBefore() メソッドを使用して、DOM ツリーに新しいノードを挿入します。このメソッドには、挿入される新しいノードと参照ノード (つまり、新しいノードが挿入されるノード) の 2 つのパラメータが必要です。

簡単な JavaScript チュートリアル: HTTP ステータス コードを取得する方法 簡単な JavaScript チュートリアル: HTTP ステータス コードを取得する方法 Jan 05, 2024 pm 06:08 PM

JavaScript チュートリアル: HTTP ステータス コードを取得する方法、特定のコード例が必要です 序文: Web 開発では、サーバーとのデータ対話が頻繁に発生します。サーバーと通信するとき、多くの場合、返された HTTP ステータス コードを取得して操作が成功したかどうかを判断し、さまざまなステータス コードに基づいて対応する処理を実行する必要があります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法を説明し、いくつかの実用的なコード例を示します。 XMLHttpRequestの使用

JavaScript で HTTP ステータス コードを簡単に取得する方法 JavaScript で HTTP ステータス コードを簡単に取得する方法 Jan 05, 2024 pm 01:37 PM

JavaScript で HTTP ステータス コードを取得する方法の紹介: フロントエンド開発では、バックエンド インターフェイスとの対話を処理する必要があることが多く、HTTP ステータス コードはその非常に重要な部分です。 HTTP ステータス コードを理解して取得すると、インターフェイスから返されたデータをより適切に処理できるようになります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法と、具体的なコード例を紹介します。 1. HTTP ステータス コードとは何ですか? HTTP ステータス コードとは、ブラウザがサーバーへのリクエストを開始したときに、サービスが

See all articles