1. ホーム
  2. ジャバスクリプト

[解決済み】JavaScriptで変数を参照渡しにする

2022-04-15 15:39:18

質問

JavaScriptで変数を参照渡しにするには?

いくつかの処理を行いたい変数が3つあるので、それらをforループに入れ、それぞれに対して処理を行いたいのです。

疑似コードです。

myArray = new Array(var1, var2, var3);
for (var x = 0; x < myArray.length; x++){
    // Do stuff to the array
    makePretty(myArray[x]);
}
// Now do stuff to the updated variables

どうすればいいのでしょうか?

どのように解決するのですか?

JavaScriptには参照渡しがありません。オブジェクトを渡して(つまり、オブジェクトへの参照を値で渡して)、関数にそのオブジェクトの内容を変更させることは可能です。

function alterObject(obj) {
  obj.foo = "goodbye";
}

var myObj = { foo: "hello world" };

alterObject(myObj);

alert(myObj.foo); // "goodbye" instead of "hello world"

数値インデックスを持つ配列のプロパティを反復処理し、配列の各セルを変更することができますよ。

var arr = [1, 2, 3];

for (var i = 0; i < arr.length; i++) { 
    arr[i] = arr[i] + 1; 
}

ここで重要なのは、quot;参照渡しというのは非常に特殊な用語であるということです。これは、単に変更可能なオブジェクトへの参照を渡すことができるという意味ではありません。そうではなく、単純な変数を渡して、関数がその値を 呼び出し のコンテキストになります。 だから

 function swap(a, b) {
   var tmp = a;
   a = b;
   b = tmp; //assign tmp to b
 }

 var x = 1, y = 2;
 swap(x, y);

 alert("x is " + x + ", y is " + y); // "x is 1, y is 2"

C++のような言語では、それが可能なのは、その言語が が行います。 (一種の)参照渡しがあります。

編集 - というのは、最近(2015年3月)、後述の私のブログと似たような記事をめぐって、Redditで再び大爆発しました(この場合はJavaに関するものですが)。Redditのコメントのやり取りを読んでいて、この混乱の大部分は、"reference"という単語を含む不幸な衝突に起因していることに思い当たりました。参照渡し」と「値渡し」という用語は、プログラミング言語において「オブジェクト」を扱うという概念よりも古いものです。これはオブジェクトの問題ではなく、関数のパラメータ、特に関数のパラメータが呼び出し環境にどのように接続されるか(または接続されないか)の問題なのです。特に、真の参照渡し言語、すなわち する。 オブジェクトが関係する場合でも、オブジェクトの 内容 また、見た目もJavaScriptとほぼ同じになります。しかし また は、呼び出し側の環境でオブジェクトの参照を変更することができます。 はできません。 JavaScriptでは 参照渡しの言語では 参照そのものを渡すのではなく 参照への参照 .

編集 - に関するブログ記事を紹介します。 (C++には参照渡しがないことを説明するその投稿のコメントに注目してほしい。 その通りだ。しかし、C++には、関数呼び出しの時点で明示的にポインターを作成するか、または、C++の変数への参照を作成する機能があります。 暗黙のうちに 引数の型シグネチャがそれを要求している関数を呼び出すとき。これらは、JavaScriptがサポートしていない重要な点です)。