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
これを行う最善の方法は何ですか?
ベストアンサー1
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;
}
「参照渡し」は非常に特殊な用語であることに注意することが重要です。これは、変更可能なオブジェクトへの参照を渡すことが可能であるという単純な意味ではありません。代わりに、関数が呼び出しコンテキストでその値を変更できるように、単純な変数を渡すことが可能であることを意味します。つまり、
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 のコメントでのやり取りを読んでいると、混乱の大部分は「参照」という単語の不運な衝突から生じていることに気づきました。「参照渡し」と「値渡し」という用語は、プログラミング言語で「オブジェクト」を扱うという概念よりも前から存在していました。これは実際にはオブジェクトに関するものではなく、関数のパラメータに関するもので、具体的には関数のパラメータが呼び出し環境に「接続」されている (または接続されていない) かどうかに関するものです。特に、真の参照渡し言語 (オブジェクトを含む言語) では、オブジェクトの内容を変更する機能が依然としてあり、JavaScript とほぼ同じように見えることに注意してください。ただし、呼び出し環境でオブジェクト参照を変更することもできます。これはJavaScript ではできない重要なことです。参照渡し言語では、参照自体ではなく、参照への参照が渡されます。
編集-このトピックに関するブログ投稿はこちらです。(その投稿へのコメントで、C++ には実際には参照渡しがないことが説明されていることに注目してください。これは本当です。ただし、C++ には、関数呼び出し時に明示的にポインターを作成するか、引数の型シグネチャでそのように要求されている関数を呼び出すときに暗黙的に、プレーン変数への参照を作成する機能があります。これらは、JavaScript がサポートしていない重要な機能です。)