「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 つのメンバー ポインターは変更されているため、出力した結果が表示されます
}
では、このコードはどう説明すればよいでしょうか。 ? ?
コードをコピー
console.log(arguments, a, b);
})(-1, -2);
のみ a、b... と言うことができます。これは、arguments[0],...[n] のエイリアスです。
何か間違っている点がありましたら、ご指摘ください、よろしくお願いします。
もっと良い説明がある場合は、共有してください。