このような数値、文字列、ブール値などの基本的なタイプは、それらが値によって渡されるようJS構文では、値によって渡され、等オブジェクト{:10、B:20 }、 それらが値を渡すは、パス値を引用しています
オブジェクトのために、ここに深いコピーと浅いコピーに遭遇した問題をまとめたもの。
= 10、Bが=:基本的なタイプのような、値によって渡され 、 システムが異なるとB、お互いの間には相互作用のためのメモリ空間を割り当てます。
var a = 10;
var b = a;
b = 20;
console.log(a); //输出结果为10
console.log(b); //输出结果为20
しかし、オブジェクトのために、結果は逆です。
シャローコピー:
var obj1 = {
a: 10,
b: {
a: 'yf',
b: 'bl'
},
c: ['Bob','Tom','nick'],
d: function(){
console.log('Hello World');
}
};
var obj2 = obj1;
obj2.a = 30;
console.log(obj1);
console.log(obj2);
console.log(obj1 === obj2);
出力:
私は明らかに私が行ったOBJ2、我々はobj2はなかったものの、全メモリ空間に相当割り当ては、そうOBJ1割り当てられている、メモリ空間の同じ部分を指しOBJ2、上記のコードブロック、OBJ1から見ることができます変更は、これは浅いコピーと呼ばれています。
ディープコピー:
1、JSONデータの解析では、深いコピーを実現します。
// 使用JSON数据解析来实现深度拷贝(JSON不能够识别Function类型)
var obj1 = {
a: 10,
b: {
a: 'yf',
b: 'bl'
},
c: ['Bob','Tom','nick'],
d: function(){
console.log('Hello World');
}
};
function deepClone(obj){
return JSON.parse(JSON.stringify(obj));
}
var e = deepClone(obj1);
e.a = 20;
console.log(e);
console.log(obj1);
// 通过类型检测判断JSON是不识别Function类型的
console.log(typeof e.d);
console.log(typeof obj1.d);
得られた出力を以下に示します。
このようにJSONの解析データを理解しやすくされて使用して、我々はJSON文字列に変換するJSON.stringifyを使用し、文字列と元のオブジェクトを再生成するには、この時間は何の関係もありません、それは文字列ですメモリ再オープンし、その後、我々は古いものと新しいオブジェクトを操作JSON.parse、この場合には、オブジェクトに変換使う私たちの出力の結果が異なる値であり、互いに独立しています。
**短所:**このメソッドは、致命的なエラーを持って、目的関数の種類を認識できない、JSON.stringify()関数を識別することができない、未定義戻りますので、この方法では唯一のオブジェクトデータのみに使用することができますインチ このメソッドは関係なく、オブジェクトのコンストラクタは、オブジェクトにそれを向けるだろうというものを、深いコピーした後、オブジェクトコンストラクタを放棄しないだろう。
この問題を解決するために、我々は、オブジェクト属性の出力を横断する再帰的なメソッドを使用します。
2、再帰的なコピー
function deepClone(Obj1, Obj2) {
var obj = Obj2 || {};
for (var i in Obj1) {
var prop = Obj1[i];
// 避免相互引用对象导致死循环,如initalObj.a = initalObj的情况
if(prop === obj) {
continue;
}
if (typeof prop === 'object') {
obj[i] = (prop.constructor === Array) ? [] : {};
arguments.callee(prop, obj[i]);
} else {
obj[i] = prop;
}
}
return obj;
}
var str = {};
var obj = { a: {a: "hello", b: 21, c: function(){alert('hello world');}}};
deepClone(obj, str);
console.log(str.a);
再帰的な方法は、我々が正常に機能によって引き起こされる問題を解決し、また、オブジェクトの呼び出しを横断期限の状況がお互いを引き起こし避けることができます。
深いと浅いコピーのコピーの間の差の最後まで言葉で:
浅いコピーは同じメモリ空間新旧のオブジェクト参照で、変更はすべて、すなわち、変更されます。変更をすべてを変え、古いオブジェクト参照が元の空間でのディープコピーを、新しいオブジェクトを新しいスペースは、自分のサイズを制御します。