0

結果はなぜ{"a":"b","c":1}ですか?

var foo = {"a":"b","c":0};
var bar = foo;
bar.c++;
alert(JSON.stringify(foo));

この動作を無効にする方法は?

4

4 に答える 4

4

foobar変数の両方が同じオブジェクトを参照します。そのオブジェクトを変更するためにどの参照を使用するかは重要ではありません。

この動作を無効にすることはできません。これがJavaScriptや他の多くの主要言語の動作方法です。できることは、オブジェクトを明示的に複製することだけです。

var foo = {"a":"b","c":0};
var bar = {"a":foo.a, "c": foo.c};
bar.c++;
于 2012-04-25T15:42:38.753 に答える
3

まず、Javascriptはポインタを渡さず、わずかに異なる参照を渡します。第二に、残念ながら、 Javascriptのデフォルトの動作を変更する方法はありません

コンストラクターを作成し、それを使用して、オブジェクトの2つの類似しているが別々のインスタンスを作成することをお勧めします。

function Foo(a, b) {
    this.a = a;
    this.b = b;
}

var bar1 = new Foo(0, 0);
var bar2 = new Foo(0, 0);
bar2.b++;

console.log(bar1);
console.log(bar2);

>> {a:0, b:0};
>> {a:0, b:1};
于 2012-04-25T15:43:26.230 に答える
3

あなたがしているのは、オブジェクトへの2番目の参照を作成することですが、必要なのは、代わりにそのオブジェクトのコピーです。

その機能が必要な場合は、すべてのプロパティを1つずつ新しいオブジェクトにコピーするコピー関数が本当に必要です。

// Take all the properties of 'obj' and copy them to a new object,
// then return that object
function copy(obj) {
  var a = {};
  for (var x in obj) a[x] = obj[x];
  return a;
}

var foo = {"a":"b","c":0};
var bar = copy(foo);
bar.c++;
alert(JSON.stringify(foo));

そして、あなたは得るでしょう{"a":"b","c":0}

于 2012-04-25T15:47:30.457 に答える
2

javascriptの動作を無効にすることはできません。

参照オブジェクトを変更すると、すべてのオブジェクト参照に影響します。

于 2012-04-25T15:42:43.920 に答える