Javascriptの中の深いコピーと浅いコピー

3080 ワード

javascriptの中の深いコピーと浅いコピー
浅いコピーは何ですか?コピーは何ですか?
1.レプリカ:レプリカはコピー参照、コピー後の参照は同じオブジェクトを指す例であり、お互いの動作は互いに影響し合う.
//          obj1        obj。
var obj={name:'zhangsan',age:24}
var obj1=obj;
console.log(obj1.name);//zhangsan

//  obj1 name  ,obj name         
obj1.name='lisi';
console.log(obj.name)//lisi
consloe.log(obj1.mane)//lisi
上記のように直接的に値を賦課する方式は浅いコピーです.この時、obj 1の値が変わって、元のobjも変化します.しかし、多くの場合、私達が欲しいのはこのような状況ではなく、元のオブジェクトの値をコピーしただけで、Obj 1を変えるとき、Objは変化する必要がありません.この場合は、深コピーが必要です.
2.ディープコピー:メモリをヒープに再割り当てし、ソースオブジェクトのすべての属性を新規にコピーし、深くコピーする対象の参照図には元のオブジェクトまたは対象図のいずれのオブジェクトも含まれていないことを保証し、コピーしたオブジェクトは元のオブジェクトと完全に分離され、互いに影響しない.
//               ,            .
//            ,                。


function deepCopy(a, b) {
  var b = b || {};
  for (var i in a) {
    if (typeof a[i] === 'object') {
      b[i] = (a[i].constructor === Array) ? [] : {};
      deepCopy(a[i], b[i]);
    } else {
       b[i] = a[i];
    }
  }
  return b;
}

var arr =['zhangsan','lisi','wangwu'];
var newArr=deepCopy(arr,newArr);

console.log(arr[1]);//lisi
console.log(newArr[1]);//lisi

newArr[1]='zhaoliu';
console.log(arr[1]);//lisi
console.log(newArr[1]);//zhaoliu