7

次のコードがあります (jQquery ライブラリを使用しています)。

var obj = {};
var objstring = '{"one":"one","two":"two","three":"three"}'

// first console output
console.log(objstring);

var jsonobj = $.parseJSON(objstring);

// second console output
console.log(jsonobj);

obj.key = jsonobj;
obj.key.test = "why does this affect jsonobj? (even in the second console output)";

// third console output
console.log(jsonobj);

私の質問: obj.key = jsonobj を実行すると、新しい obj.key の値が変更されます。jsonobj の値も変更されるのはなぜですか? そして、どうすればそれを回避できますか?(jsonobj の新しい「コピー」が必要です)。

このテスト ケースを作成しました: http://jsfiddle.net/WSgVz/

4

5 に答える 5

5

JavaScript オブジェクト参照のより大きな問題については他の人がうまく対処しているので、ここで起こっていることの小さな部分に対処したいと思います。

// second console output
console.log(jsonobj);

obj.key = jsonobj;
obj.key.test = "why does this affect jsonobj? (even in the second console output)";

これは文書化された WebKit バグの結果であり、console.logステートメントは呼び出し時にオブジェクトを出力せず、しばらくしてから出力されますconsole.log

于 2011-07-06T19:34:02.100 に答える
3

これは、オブジェクトがコピーされていないためです。プロパティにはオブジェクトへのobj.key参照のみが含まれるため、エフェクトに何かを割り当てる場合obj.key.testは、に割り当てる場合と同じjsonobj.testです。

jQueryメソッドextendを使用して、コピーを作成できます。

obj.key = $.extend({}, jsonobj);

これにより、値が新しく作成されたオブジェクト({})にコピーされます。

于 2011-07-06T19:30:43.060 に答える
1

これは、コピーが行われていないためです。さまざまな変数やプロパティによって参照されるオブジェクトは1つだけです。を行う場合obj.key = jsonobj、同じオブジェクトへの参照をコピーしているだけです。

于 2011-07-06T19:27:12.093 に答える
1

JavaScriptのすべてのオブジェクトは参照によってコピーされます。つまり、次のようになります。

var x = {};
var y = x;
x.foo = 22; // y.foo also = 22 since y and x are the same object

必要obj.key != jsonobjに応じて、オブジェクトのクローンを作成する必要があります。新しいオブジェクトを作成することにより:

obj.key = $.parseJSON(objstring);

または、jQueryを使用して既存のものを複製します。

obj.key = $.extend({}, jsonobj);
于 2011-07-06T19:27:20.427 に答える