0

次のコードを検討してください

var myData = {name: 'John'};

function fixName(data) {
    var newData = data;
    newData.name = 'Mike';
    return newData;
}

var myData2 = fixName(myData);
console.log(myData2.name);
console.log(myData.name);

関数内でnewDataとmyDataが同じものを指しているため、「Mike」は2回出力されます。myDataに副作用がないように関数を変更するにはどうすればよいですか?これは、プログラムが「マイク」、次に「ジョン」を出力する必要があることを意味します。

4

4 に答える 4

4

オブジェクトの「クローン作成」(これは非常に複雑です) についての説明については、この回答を参照するか、 J.Resig自身が提供する簡単なルートを使用して、このクローン作成コードを技術的に単純な構文

于 2012-05-20T06:39:26.790 に答える
2

それで、基本的に、参照を取得する代わりに、オブジェクトのコピーを作成したいですか?

この場合、受け入れられた回答がjQueryの単純な部分を使用してそれを行うこの質問に興味があるかもしれません。

私のように、jQueryを使用したくない場合は、ループを使用して基本的なコピーを取得できます。

var myData2 = {};
for( var x in myData) if( myData.hasOwnProperty(x)) myData2[x] = myData[x];
// Copied!

これは、連想配列として使用されているオブジェクトには実際には十分です(あなたのように見え、ほとんどのJSONオブジェクトもそうです)。

于 2012-05-20T06:39:00.733 に答える
1

そのデータ オブジェクトを複製する必要があります。

オブジェクトのクローンを作成する最良の方法は何ですか

// jQuery
newData = $.extend({}, data);
于 2012-05-20T06:39:33.420 に答える
1

クローンmyDataするには、次を使用できますJSON.parse(JSON.stringify(myData))

var myData = {name: 'John'};

function fixName(data) {
    var newData = data;
    newData.name = 'Mike';
    return newData;
}

var myData2 = fixName( JSON.parse(JSON.stringify(myData)) );
console.log(myData2.name); //=> Mike
console.log(myData.name);  //=> John

ちなみに、これはネストされたオブジェクトも複製します。

それから関数を作成することはアイデアかもしれません:

function cloneObj(obj,reviver){
  return JSON.parse(JSON.stringify(obj),reviver);
}

reviverオブジェクト内のデータを操作するために使用できる場所。あなたの場合、それはfixName時代遅れになります。

var myData2 = cloneObj(myData, function(k,v){return k === 'name' ? 'Mike' : v;});
于 2012-05-20T06:55:29.010 に答える