5

2 つのスクリプトの動作が異なるのはなぜですか? 最初のスクリプトを使用したいのですが、2 番目のdrawData()呼び出しでは変更されdataます。それは奇妙で、私が望んでいることではありません。2 番目のスクリプトには、この問題はありません。なぜそうなのか、最初のスクリプトを修正するにはどうすればよいですか?

最初のスクリプトは変更されませんdata:

    var data = ["right"];

    function drawData(arrs, type) {
        if (type == "percentage") {
            arrs[0] = "omg";
        }
        console.log(data[0]); // Changed!?
    }
    drawData(data);
    drawData(data, "percentage");

2 番目のスクリプト:

    var data = "right";

    function drawData(arrs, type) {
        if (type == "percentage") {
            arrs = "omg";
        }
        console.log(data); // OK, not changed.
    }
    drawData(data);
    drawData(data, "percentage");

4

2 に答える 2

2

これは、ローカル変数への割り当てと、指定されたオブジェクトの変更の違いです。

コードの両方の部分にarrsは、 とは異なるローカル変数がありますdata。しかし、 の要素とその他のプロパティは、arrsとまったく同じですdata。これらのプロパティ値への変更 (一般にオブジェクト/配列の変更と呼ばれます) は、 経由または 経由のどちらでアクセスしても表示さarrsますdata。そして、これはまさに最初のスクリプトが行うことです。

ただし、2 番目のスクリプトは のプロパティ値を変更しませんがarrs、まったく新しい値を に割り当てます。arrsこれにより、 とプロパティを共有しなくなりますdatadata前の段落で説明したように、とarrsはどちらも変更できないプリミティブな値であるため、これはさらに明白です。ただし、それらがオブジェクトまたは配列であったとしても、次の割り当てを行います。

arrs = [1234];

には影響しませんdata。直接割り当てずdataに のプロパティ/インデックスに割り当てた場合にのみ影響を受けます。arrsarrs

于 2018-05-19T20:26:56.773 に答える
0

最初のバリアントは、パラメーターとして関数に渡されたオブジェクト (たまたま配列) を変更します。したがって、この変更は関数の外で見られます。2 番目のバリアントは、関数パラメーター (たまたま配列への参照) に新しい値を割り当てますが、配列自体は変更しません。

于 2012-06-12T04:55:28.857 に答える