JavaScript 関数のパラメータは値 (byVal) で渡されるべきですか? それともアドレス (byRef) で渡されるべきですか?

WBOY
リリース: 2016-05-16 17:30:38
オリジナル
1751 人が閲覧しました

「JavaScript 関数のパラメータが値 (byVal) で渡されるか、アドレス (byRef) で渡されるか」という問題に関して、よく誤解があります。数値や文字列などの「単純な型」は、値、Number、String で渡されるというものです。 、オブジェクト、配列などの「複合型」はアドレス渡しです。
これは間違っていませんか?なぜこのような誤解が生じるのでしょうか?これら 2 つのコードを見てください:

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

//虚数コードを値に渡す
function modifyLikeByVal(x){
x = 1;
console.log('x = %d', x);
}
var x = 0;
console.log('x = %d', x); // 出力 x = 0
modifyLikeByVal(x); // 出力 x = 1
console.log('x) = %d', x ); // 出力 x = 0 x は変更されていません。

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

//原因偽アドレス送信
関数modifyLikeByRef(x){
x[0] = 4;
x[1] = 5;
x[2] = 6;
consoleのコード.log('x = [ %s ]', x.join(', '));
}
var x = [1, 2, 3];
console.log('x = [ %s ]' , x.join(', ')); // 出力 x = [ 1, 2, 3 ]
modifyLikeByRef(x); // 出力 x = [ 4, 5, 6 ]
console.log( 'x = [ %s ]', x.join(', ')); // 出力 x = [ 4, 5, 6 ] x が変更されました。

したがって、上記のコードから、「単純型」はパラメータとして値 (byVal) で渡され、「複合型」はパラメータとしてアドレス (byRef) で渡されると結論付けることができます。 。

何が問題ですか?

2 つの関数を注意深く観察すると、次の 1 つのことがわかります:
byVal では、パラメーター x が直接変更されます: x = 1;
byRef では、パラメーター x のメンバーが変更されます: x[0] = 4; x[1] = 5;

私の推測では、JavaScript ではすべての変数またはメンバーはポインターであり、変数またはメンバーの値を変更すると、実際にはポインターのアドレスが変更されます。

上記のコードは次のように説明できます。

「byVal」内:

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

global { // はグローバル スコープを表し、次は関数スコープを表します。
var x = 0; // ポインタ x を初期化し、数値 0
fun(x) {
x = global. x; // パラメータ global.x を渡します。 fun フィールドの x ポインタ アドレスは数値 0
を指します。 // fun フィールドの x ポインタ アドレスを数値 1 を指すように変更します。 🎜> } // fun ドメインは終了しますが、グローバル ドメインの x ポインタは変更されていません
}

In "byRef":

コードをコピー コードは次のとおりです:
global { // グローバル スコープを表し、以下は関数スコープを表します
/*
ポインタ x を初期化し、配列 [1, 2, 3] を指します。
は実際には、x、0、1、2 の 3 つのメンバーで、それぞれ 1、2、3 を指します
*/
var x = [1, 2, 3];
fun(x) {
x = global.x; // fun フィールドの x ポインター アドレスを渡します。配列 [1, 2, 3]
/ + = 4;
x[1] = 5;
x[2] = 6;
} // 楽しいフィールドは終わり、xグローバル フィールドのポインターは変更されていませんが、その 3 つのメンバー ポインターは変更されているため、出力した結果が表示されます
}


では、このコードはどう説明すればよいでしょうか。 ? ?



コードをコピー
コードは次のとおりです。(function(a, b){ 引数 [0] = 1; b = 2;
console.log(arguments, a, b);
})(-1, -2);


のみ a、b... と言うことができます。これは、arguments[0],...[n] のエイリアスです。

何か間違っている点がありましたら、ご指摘ください、よろしくお願いします。
もっと良い説明がある場合は、共有してください。
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!