4
  myObj = {
    prop1: 'alpha',
    prop2: 'beta',
    priceUpdatedOn: new Date()
  };

  myObjQuery = myObj;
  delete myObjQuery.priceUpdatedOn;

console.log(myObj);
console.log(myObjQuery);

私がそれをすると、何らかの理由でpriceUpdatedOnからも削除されます。myObj理由はありますか?

4

4 に答える 4

4

これは、myObjQuery と myObj が同じオブジェクトであるためです。を実行するmyObjQuery = myObjと、オブジェクト自体のコピーではなく、オブジェクトへの参照のコピーが作成されます。JavaScript でオブジェクトを直接操作することはなく、常に参照を介して操作します。

編集: JavaScript でオブジェクトを複製するのは簡単ではありません。jQuery や Ext などのほとんどのライブラリには、それを行う手段があります。手動で行うには、このようなものが機能します。

var clone = {};
for(var prop in myObj) {
   if(myObj.hasOwnProperty(prop)) {
       clone[prop] = myObj[prop];
   }
}

浅いコピーであることに注意してください。ディープ コピーを行うには、プロパティ自体がオブジェクトであるかどうかを検出し、それらも再帰的に複製する必要があります。これをすべて行うライブラリを使用することをお勧めします。また、これには多くのエッジケースが欠けていること、およびオブジェクトのコンストラクタープロパティなどの奇妙なことがあることに注意してください。ここでは、JavaScript が非常に厄介です。

于 2012-04-14T13:20:39.637 に答える
3

Javascript は参照を処理します。myObjQuery と myObj は、メモリ内の同じデータへの参照です。1 つのプロパティを変更すると、メモリ内のコピーが変更されるため、それに対するすべての参照が変更されます。代わりにオブジェクトを複製する必要があります

于 2012-04-14T13:21:28.310 に答える
1

そのコマンドで

myObjQuery = myObj;

オブジェクトのコピーを作成するのではなく、オブジェクトへの参照のコピーを作成するだけです。その後、両方ともmyObjQuery同じmyObjオブジェクトを指します。そのオブジェクトのプロパティを削除すると、両方の参照にその変更が反映されます。

于 2012-04-14T13:22:07.230 に答える
1

myObjQuery は myObj の別名にすぎないためです。一方を変更すると他方に反映されます。

参照: http://docstore.mik.ua/orelly/webprog/jscript/ch11_02.htm

于 2012-04-14T13:22:34.733 に答える