オブジェクトにループ配列を割り当て、配列にpushを適用

2649 ワード

var a = {b:[]};
var c = {
    name:'',
    age:'7'
};
var d = ['bj','sh','sz','gz']
for(var i in d){
    c.name = d[i];
    a.b.push(c)
}

上図のように:
配列dをループし、各項目をc.nameに割り当て、pushからa.bに割り当てる
コード感覚は問題ありませんが、印刷結果は次のとおりです.
0:{name: "gz", age: "7"}
1:{name: "gz", age: "7"}
2:{name: "gz", age: "7"}
3:{name: "gz", age: "7"}
正しくは次のように書かれています.
var a = {b:[]};
var d = ['bj','sh','sz','gz']
for(var i in d){
    var c = {
        name:d[i],
        age:'7'
    };
    a.b.push(c)
}

正しい結論を出す:
0:{name: "bj", age: "7"}
1:{name: "sh", age: "7"}
2:{name: "sz", age: "7"}
3:{name: "gz", age: "7"}
解析:
objectは参照データ型であり、以上のエラーコードでは同じアドレスのnameのみが操作され、c.nameの値は常に変化し、a.b.push()の値は最後に得られたデータ'gz'である.
拡張js基本データ型と参照データ型
基本データ型:
Number、String、Boolean、Null、およびUndefind.基本データ型は、変数に保存されている実際の値を直接操作できるため、値によってアクセスされます.例:
  var a = 10;
  var b = a;
  b = 20;
  console.log(a);//10値
以上、bは、2つの変数の値は等しいが、2つの異なる基本データ型値を保存するaのコピーに値する.
bはaレプリケーションのコピーを保存しただけです.したがって,bの変化はaに影響を及ぼさない.
次の図は、このような基本データ型を割り当てるプロセスを示しています.
参照データ型:
つまり、オブジェクトタイプObject typeです.たとえば、Object、Array、Function、Dataなどです.
JAvascriptの参照データ型は、スタックメモリに保存されているオブジェクトです.
他の言語とは異なり、スタックメモリ領域の位置やスタックメモリ領域の操作に直接アクセスすることはできません.スタックメモリ内のオブジェクトの参照アドレスのみを操作できます.
したがって、参照タイプデータはスタックメモリに保存され、実際にはオブジェクトのスタックメモリにおける参照アドレスである.この参照アドレスを使用すると、保存中のスタックメモリ内のオブジェクトをすばやく検索できます.
  var obj1 = new Object();
  var obj2 = obj1;
  obj2.name=「名前がついた」
  console.log(obj1.name);//名前がついた
この2つの参照データ型が同じスタックメモリオブジェクトを指していることを示します.obj 1はonj 2に割り当てられ、実際にこのスタックメモリオブジェクトはスタックメモリの参照アドレスでobj 2にコピーされ、
しかし、実際には同じスタックメモリオブジェクトを指しています.実際に変更されたのは、スタックメモリオブジェクトです.
次に、この参照データ型付与プロセスについて説明します.
転載先:https://juejin.im/post/5afafa4051882542ac7d6836