javascriptの値伝達と引用伝達
4626 ワード
この問題を分析する前に、私たちは何が値によって伝達されているのかを知る必要があります.何が引用によって伝達されていますか?コンピュータ科学では、この部分をデマンド戦略といいます.変数間、関数呼び出し時の実参照と参照の間の値はどのように伝達されるかを決定します.
値でVSを伝達します.引用で伝達します.
値による伝達は最も一般的な求値戦略である.関数の形参は呼び出し時に渡される実参のコピーである.参照値を変更すると、実際の参照には影響しません.
参照によって渡すと、関数の形は、コピーではなく、実際に参照してください.これは、関数の参照値が修正されると、実際の参照も修正されることを意味する.同時に両者は同じ値を指す.
引用伝達によっては、関数が呼び出した追跡がより困難になり、微妙なバグを引き起こすこともあります.
毎回クローンコピーが必要なため、いくつかの複雑なタイプに対して性能が低い.二つの伝値方式はそれぞれの問題があります.
まずCの例を見て、値と引用伝達の違いを理解します.
ここで私たちは見られます. a=>pが値で転送されると、変形されたイメージの値は、実際の参加aに影響を与えず、pはaのコピーにすぎない. b=>qは、参照伝達に従って、変形qの値が修正された場合にも、実参照bの値に影響を及ぼします. JS値の伝え方を探る
JSの基本タイプは、値によって伝達されます.
また対象を見ます
oとobjは同じオブジェクトであり、oはobjのコピーではないと説明します.だから値通りに送るのではない.このようにJSの対象は引用によって伝達されるということを説明しますか?私たちは次の例を見ます.
引用によって伝達される場合は、モザイクの値を修正することが、実務に影響を及ぼすはずです.ここでoの値を修正すると、objには影響しません.したがって、JSの対象は引用によって伝達されるわけではない.いったい、対象の値はJSでどのように伝えられていますか?
共有によるcall by shringの転送
正確には、JSの基本的なタイプは値によって伝達され、対象のタイプは共有によって伝達されます.最初はBarbara Liskyov.1974年のGLAU言語で提出されました.この求値戦略は、Python、Java、Ruby、JSなどの複数の言語に使用される.
このポリシーのポイントは、関数を呼び出して参照すると、関数はオブジェクトの実際参照のコピーを受け取ります.これは参照によって伝達されるものとは違います.共有伝達における関数のイメージ形成の値は、実際の参照の値に影響しません.以下の例のように、Objの値は、モザイクの値を修正することによって修正されてはいけない.
しかし、参照は副本であるが、参照の対象は同じである.これらは同じオブジェクトを共有していますので、オブジェクトの属性値を変更しても、パラメータの属性値に影響します.
オブジェクトの種類については、オブジェクトが可変であるため、変更対象自体が共有対象の参照および参照コピーに影響を及ぼします.基本的なタイプについては、いずれも可変ではないので、共有によって伝達されるのと、値によって伝達されるのとは区別がないので、JSベースのタイプは、値によって伝達されるのと、共有によって伝達されるのと同じである.
var a=1;//1はnumberタイプで、可変var b=aではありません.b=6;
共有伝達のための求値ポリシーによれば、aとbは異なる参照(bはaの参照コピー)であるが、同じ値を参照する.ここの基本タイプの数字は1可変ではないので、ここでは値によって伝達され、共有によって伝達されるという違いはない.
基本タイプの不変性
基本タイプは可変ではなく、オブジェクトだけが可変です.例えば、数字100、ブール値true、false、これらの値を修正します.(例えば、1を3にして、trueを100にします.)意味はありません.誤解しやすいのは、JSの中のストリングスです.文字列の内容を変えることを試みることがありますが、JSでは、どのようなstring値に対しても「変更」操作は、実際には新しいstring値を作成します.
対象は違っています.対象は可変です.
ここで変数objを定義し、値はobjectであり、その後にObj.x属性の値を100とする.その後、他の変数oを定義し、値は依然としてこのObjectオブジェクトであり、このとき、Objとoの2つの変数の値は同じオブジェクトを指す(同じオブジェクトの参照を共有する).したがって、オブジェクトの内容を変更すると、objとoに影響があります.ただし、対象は引用伝達ではなく、o=trueでoの値を修正しても、objには影響しません.
用語の異なるバージョン
注意する必要があるのは、値を求める策略の中の「引用」と値を求める策略自身はすべて抽象的な概念で、ここの引用と言語の具体的な引用(例えばC++の&a、C〓のrefパラメーター)は異なっていることができて、混淆しないでください.
JSは、伝達対象タイプの値に対して、参照の副本を値によって伝達するので、Dmitryの博文(リンク)を参照して、現在、JSの求値戦略には2つの解釈がある. JSは、いずれも「値によって伝達される」という求値ポリシーを採用しており、対象のタイプはより特殊であり、実際には値によって参照が伝達されている(すなわち、参照によって伝達されるのではなく、参照のコピーを伝達する).この角度から、対象も値によって伝達されるというのは道理があります.(私はあまり賛成していませんが) は、共有伝達による値決定策を導入し、正確な区別を共有伝達と古典の値によって伝達し、引用伝達によって異なる.この場合、「基本的なタイプは値によって伝達され、対象は共有によって伝達される」(筆者のより傾向的な説明) は、パラメータタイプによって区別されてもよい.
結論
JSの価値を求める策略について多くの論争とバージョンがありますが、ブロガーの比較傾向の結論は以下の通りです.
「JSの基本的なタイプは値によって伝達され、対象のタイプは共有によって伝達される.」
言語の抽象概念は博主の創造や憶測ではなく、文章中の関連理論は全部参考になります.詳しくは下記の参考文献をご参照ください.
また、ブログ園友@京山遊侠@greatimの素晴らしい討論と補充に感謝します.
参考文献 Wikipedia.org-Everaluation strategy http://dmitrysoshnikov.com/-Evaluation ストラテジー
値で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);
}
ここで私たちは見られます.
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, !
oとobjは同じオブジェクトであり、oはobjのコピーではないと説明します.だから値通りに送るのではない.このようにJSの対象は引用によって伝達されるということを説明しますか?私たちは次の例を見ます.
var obj = {x : 1};
function foo(o) {
o = 100;
}
foo(obj);
console.log(obj.x); // 1, obj 100.
引用によって伝達される場合は、モザイクの値を修正することが、実務に影響を及ぼすはずです.ここでoの値を修正すると、objには影響しません.したがって、JSの対象は引用によって伝達されるわけではない.いったい、対象の値はJSでどのように伝えられていますか?
共有によるcall by shringの転送
正確には、JSの基本的なタイプは値によって伝達され、対象のタイプは共有によって伝達されます.最初はBarbara Liskyov.1974年のGLAU言語で提出されました.この求値戦略は、Python、Java、Ruby、JSなどの複数の言語に使用される.
このポリシーのポイントは、関数を呼び出して参照すると、関数はオブジェクトの実際参照のコピーを受け取ります.これは参照によって伝達されるものとは違います.共有伝達における関数のイメージ形成の値は、実際の参照の値に影響しません.以下の例のように、Objの値は、モザイクの値を修正することによって修正されてはいけない.
var obj = {x : 1};
function foo(o) {
o = 100;
}
foo(obj);
console.log(obj.x); // 1, obj 100.
しかし、参照は副本であるが、参照の対象は同じである.これらは同じオブジェクトを共有していますので、オブジェクトの属性値を変更しても、パラメータの属性値に影響します.
var obj = {x : 1};
function foo(o) {
o.x = 3;
}
foo(obj);
console.log(obj.x); // 3, !
オブジェクトの種類については、オブジェクトが可変であるため、変更対象自体が共有対象の参照および参照コピーに影響を及ぼします.基本的なタイプについては、いずれも可変ではないので、共有によって伝達されるのと、値によって伝達されるのとは区別がないので、JSベースのタイプは、値によって伝達されるのと、共有によって伝達されるのと同じである.
var a=1;//1はnumberタイプで、可変var b=aではありません.b=6;
共有伝達のための求値ポリシーによれば、aとbは異なる参照(bはaの参照コピー)であるが、同じ値を参照する.ここの基本タイプの数字は1可変ではないので、ここでは値によって伝達され、共有によって伝達されるという違いはない.
基本タイプの不変性
基本タイプは可変ではなく、オブジェクトだけが可変です.例えば、数字100、ブール値true、false、これらの値を修正します.(例えば、1を3にして、trueを100にします.)意味はありません.誤解しやすいのは、JSの中のストリングスです.文字列の内容を変えることを試みることがありますが、JSでは、どのようなstring値に対しても「変更」操作は、実際には新しいstring値を作成します.
var obj = {x : 1};
function foo(o) {
o.x = 3;
}
foo(obj);
console.log(obj.x); // 3, !
対象は違っています.対象は可変です.
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オブジェクトであり、このとき、Objとoの2つの変数の値は同じオブジェクトを指す(同じオブジェクトの参照を共有する).したがって、オブジェクトの内容を変更すると、objとoに影響があります.ただし、対象は引用伝達ではなく、o=trueでoの値を修正しても、objには影響しません.
用語の異なるバージョン
注意する必要があるのは、値を求める策略の中の「引用」と値を求める策略自身はすべて抽象的な概念で、ここの引用と言語の具体的な引用(例えばC++の&a、C〓のrefパラメーター)は異なっていることができて、混淆しないでください.
JSは、伝達対象タイプの値に対して、参照の副本を値によって伝達するので、Dmitryの博文(リンク)を参照して、現在、JSの求値戦略には2つの解釈がある.
結論
JSの価値を求める策略について多くの論争とバージョンがありますが、ブロガーの比較傾向の結論は以下の通りです.
「JSの基本的なタイプは値によって伝達され、対象のタイプは共有によって伝達される.」
言語の抽象概念は博主の創造や憶測ではなく、文章中の関連理論は全部参考になります.詳しくは下記の参考文献をご参照ください.
また、ブログ園友@京山遊侠@greatimの素晴らしい討論と補充に感謝します.
参考文献