2

次のコードを見て、誰かが JavaScript で値がどのように渡されるか説明できますか?

function loadImages() {
  for(var sec in images) {
    theme = images[sec];
      for(var tsec in theme) {
        theme[tsec].img = new Image();
        theme[tsec].img.src = 'images/'+theme[tsec].src+'.png';
      }
  }
}

次に、別の関数で:

function definitionToSpriteDataMapping() {
  var result = {};
  for(var definition in blocks) {
    var sprite = blocks[definition].sprite;
    for(var secnm in images) {
      section = images[secnm];
      for(var spritenm in section) {
        if(sprite == spritenm) {
          result[definition] = {};
          result[definition].img = section.img;
        }
      }
    }
  }
  return result;
}

簡単にするためにいくつかのコードを切り取りましたが、それでもかなり複雑です。基本的に、ネストされたキーと値のペアである 2 つのオブジェクト (画像とブロック) があります。コードの最初のブロックで

theme = images[sec]; 
theme[tsec].img.src = 'images/'+theme[tsec].src+'.png';

コードの 2 行目には、

section = images[secnm];
result[definition] = {};
result[definition].img = section.img;

.img が「テーマ」に追加されるコードの最初のブロックの前に、「画像」に .img はありません。しかし、コードの 2 番目のブロックに見られるように、これは「画像」に反映されているようです。すべてのオブジェクトは JavaScript のポインターのようなものですか? 「結果」と「ブロック」との関係は、「テーマ」と「画像」との関係と同じですか? 「テーマ」から要素を削除すると、「イメージ」に反映されますか?

4

4 に答える 4

4

you を使用theme = images[sec]すると、実際にそのオブジェクトへのポインターがメモリ内に作成されます。したがって、オブジェクトに追加imgすると、同じオブジェクトであるため、その画像にthemeも追加されます。imgそうです、同じことがresult.
このような方法で参照されるオブジェクトのプロパティを変更、追加、または削除すると、実際のオブジェクトに影響します。同じことが配列にも当てはまります。

この動作が気に入らない場合は、オブジェクトを複製する必要があります。すべてのプロパティをコピーするだけで、単純なオブジェクトを複製できます。

var original = { name: "James", age: 73, male: true };
var clone = { };
for( var k in original )
    clone[ k ] = original[ k ];

ただし、そのプロパティがoriginal配列またはオブジェクト自体である場合、それは参照になります。プロパティとしてオブジェクトや配列がない場合は、上記のスニペットで問題ありません。それ以外の場合は、クローン関数を作成し、元のすべてのメンバーを再帰的にクローンする必要があります。

于 2012-05-17T17:44:56.640 に答える
2

すべてのオブジェクトは JavaScript のポインターのようなものですか?

事実上、はい。ただし、JavaScript ではオブジェクトは「参照型」であるとより一般的に述べられると思います。

オブジェクトvar aを参照し、 に割り当てaられている場合、 は保持している参照のコピーを取得するため、 とは両方ともメモリ内の同じオブジェクト データを参照します。var bbaab

参照から加えられた変更は、a参照から観察できbます。

これはまだ「値による」代入ですが、コピーされる値は参照の値であり、オブジェクト自体ではないことに注意してください。

于 2012-05-17T17:37:00.330 に答える
1

これが発生している理由は、オブジェクトが参照によって渡されるためです。オブジェクトのクローンを作成する方法があります。この他の SO 投稿を見てみましょうJavaScript オブジェクトを正しく複製するにはどうすればよいですか?

于 2012-05-17T17:39:13.020 に答える
1

images[sec][tsec]どちらの場合も変更しています。これは、メモリ内のまったく同じオブジェクトを参照しています。実行するだけtheme = images[sec]では、オブジェクトのコピーは作成されません。

この動作のより簡単な例は次のとおりです。

var obj = {};
var obj2 = obj;

obj.a = 123;
obj2.a; // 123
于 2012-05-17T17:40:02.753 に答える