価値と渡す参照で渡されます
値によるコールは、最も一般的に使用される評価戦略です。関数の正式なパラメーターは、呼び出されたときに渡された実際のパラメーターのコピーです。正式なパラメーターの値を変更しても、実際のパラメーターには影響しません。
参照(参照による呼び出し)を通過するとき、関数の正式なパラメーターは、コピーではなく実際のパラメーターの暗黙の参照を受け取ります。これは、関数パラメーターの値が変更された場合、実際のパラメーターも変更されることを意味します。どちらも同じ値を指します。
参照を通過すると、関数呼び出しの追跡がより困難になり、時には微妙なバグが発生します。
レプリカは毎回クローン化されるため、値を通過します。一部の複雑なタイプのパフォーマンスは低くなります。値を渡す両方の方法には、独自の問題があります。
まず、価値と参照を通過することの違いを理解するための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;
変更(a、&b); // a pass by value、bは参照によるパス、
// Aが変更されておらず、Bは変更されました
return(0);
}
ここにわかります:
a => pが値で渡される場合、正式なパラメーターpの値を変更しても、実際のパラメーターaには影響しません。pは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){
ox = 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年の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){
ox = 3;
}
foo(obj);
console.log(obj.x); // 3、修正!
オブジェクトタイプの場合、オブジェクトは可変であるため、オブジェクト自体を変更すると、オブジェクトの参照コピーと参照コピーの共有に影響します。基本的なタイプの場合、どちらも不変であるため、共有して値を通過すること(値によるコール)を通過することに違いはありません。そのため、JSの基本タイプは、価値を通過することと、共有による通過に並んでいます。
var a = 1; // 1はタイプ番号、不変のvar b = a; b = 6;
Sharedで渡された評価戦略によれば、AとBは2つの異なる参照です(BはAの参照コピーです)が、同じ値を参照しています。ここの基本的なタイプ番号1は不変であるため、価値を通過することとここで共有を通過することに違いはありません。
基本タイプの不変の特性
基本的なタイプは不変であり、オブジェクトのみが可変です。たとえば、数値100、ブール値は真、偽、これらの値を変更し(たとえば、1に3に変換して100に変える)意味がありません。誤解しやすいのは、JSの文字列です。文字列の内容を「変更」しようとすることもありますが、JSでは、文字列値と思われる「変更」操作は、実際に新しい文字列値を作成しています。
コードコピーは次のとおりです。
var str = "abc";
str [0]; //「A」
str [0] = "d";
str; //まだ「ABC」;割り当ては無効です。文字列のコンテンツを変更する方法はありません
オブジェクトは異なり、オブジェクトは可変です。
コードコピーは次のとおりです。
var obj = {x:1};
obj.x = 100;
var o = obj;
ox = 1;
obj.x; // 1、修正
o = true;
obj.x; // 1、o = trueのために変更されません
ここでは、変数OBJが定義され、値はオブジェクトであり、OBJ.Xプロパティの値は100に設定されます。次に、別の変数Oを定義し、値はまだこのオブジェクトオブジェクトです。この時点で、2つの変数の値はOBJとoを同じオブジェクトに指します(同じオブジェクトへの参照を共有)。したがって、オブジェクトのコンテンツを変更すると、OBJとOの両方に影響があります。ただし、オブジェクトは参照によって渡されません。 Oの値はO = trueで変更され、OBJには影響しません。