js深さクローンと浅いクローン
5418 ワード
「JavaScriptを使ってオブジェクトを深さでクローンします.」これは出現確率の高い面接問題です.以下に、両者の違いとそのコードをまとめます.
一般的には2つの異なるデータタイプの値があります.基本タイプ(undefined、Null、bollan、String、Numberを含む)は、値によって伝えられます.参照の種類(配列、オブジェクトを含む)は、アドレスによって伝達され、参照の種類は、値が伝達されるときにメモリ内のアドレスである.
1.概念
浅いクローン:基本タイプは値伝達で、オブジェクトは依然として参照伝達である.
深さクローン:すべての要素や属性が完全にクローンされ、元の参照の種類からは完全に独立しています.つまり、オブジェクトの属性が後から変更された場合、元のオブジェクトは変更されません.
深さクローンとは、オブジェクトの中のものをそっくり別のオブジェクトにコピーし、それぞれメモリの違いに置くことです.
深さクローンであれ、浅いクローンであれ、直接クローンをコピーすればいいです.一つのコピーは不潔で、その値だけをコピーしますが、もう一つのコピーは比較的徹底的で、直接にその属性などもコピーします.
2.コード
浅いクローン:
深さクローン:
一般的には2つの異なるデータタイプの値があります.基本タイプ(undefined、Null、bollan、String、Numberを含む)は、値によって伝えられます.参照の種類(配列、オブジェクトを含む)は、アドレスによって伝達され、参照の種類は、値が伝達されるときにメモリ内のアドレスである.
1.概念
浅いクローン:基本タイプは値伝達で、オブジェクトは依然として参照伝達である.
深さクローン:すべての要素や属性が完全にクローンされ、元の参照の種類からは完全に独立しています.つまり、オブジェクトの属性が後から変更された場合、元のオブジェクトは変更されません.
深さクローンとは、オブジェクトの中のものをそっくり別のオブジェクトにコピーし、それぞれメモリの違いに置くことです.
深さクローンであれ、浅いクローンであれ、直接クローンをコピーすればいいです.一つのコピーは不潔で、その値だけをコピーしますが、もう一つのコピーは比較的徹底的で、直接にその属性などもコピーします.
2.コード
浅いクローン:
//
var a="1";
var b=a;
b="2";
console.log(a);// "1"
console.log(b);// "2"
//
var c="1";
var d=c;
d="2";
console.log(c);// "1"
console.log(d);// "2"
//
var x=true;
var y=x;
y=false;
console.log(x);// true
console.log(y);// false
//
var m=function(){alert(1);};
var n=m;
n=function(){
alert(2);
};
console.log(m());//1
console.log(n());//2
以上は、浅いクローンの表現であり、基本的には基本的なタイプの値を伝えるものであり、対象は依然として引用を伝達するものである.深さクローン:
//
function cloneObject(o) {
if(!o || 'object' !== typeof o) {
return o;
}
var c = 'function' === typeof o.pop ? [] : {};
var p, v;
for(p in o) {
if(o.hasOwnProperty(p)) {
v = o[p];
if(v && 'object' === typeof v) {
c[p] = Ext.ux.clone(v);
}
else {
c[p] = v;
}
}
}
return c;
};
jsコードはJSONオブジェクトの深さクローンを実現し、新しいオブジェクトを返します.function cloneObj(obj){
var newobj = obj.constructor === Object ? {} : [];
if(typeof JSON === 'object'){
var s = JSON.stringify(obj), //
newobj = JSON.parse(s); // ( )
}else{
if(newobj.constructor === Array){
newobj.concat(obj);
}else{
for(var i in obj){
newobj[i] = obj[i];
}
}
}
return newobj;
}