js的數(shù)據(jù)類型可以分為兩大類:
值類型(原始類型):
比如String、Number類型都是值類型梁肿。引用類型:
比如Object填抬、Array是引用類型蛀骇。
簡單說一下他們兩者的區(qū)別:
最明顯的區(qū)別就是賦值。值類型的賦值是真正的copy一份賦給新的變量的:
var a, b = "issax";
a = b;
a +="_coder";
console.log(a); //issax_coder
console.log(b); //issax
看上面的例子,將b賦值給a之后,a西采、b兩個(gè)變量就是相互獨(dú)立的武通,改變自身的值不會影響到對方,這就是值類型尾菇。
然后看看引用類型:
var obj_i, obj_ii = { name: 'issax' };
obj_i = obj_ii;
obj_i['career'] = 'coder';
console.log(obj_i); //Object {name: "issax", career: "coder"}
console.log(obj_ii); //Object {name: "issax", career: "coder"}
看到?jīng)]有,將obj_ii的值賦給obj_i后憔儿,改變obj_i的內(nèi)容,會連同obi_ii的內(nèi)容也改變,這就是引用類型。引用類型的變量存儲并不是內(nèi)容本身趾徽,而是指向內(nèi)容的一個(gè)指針蜡峰,沒錯(cuò)载绿,你賦值的時(shí)候其實(shí)只是將這個(gè)指針賦值給了新變量,他們都指向同一個(gè)內(nèi)容,為什么出現(xiàn)上面的情況就不言而喻了搀玖。
握草芳来,我在說什么gui佣盒,我是來說對象的深復(fù)制的啊[捂臉]
復(fù)制又可以分為淺復(fù)制和深復(fù)制,看完上面例子,大概聯(lián)想一下就知道什么是淺復(fù)制什么是什么深復(fù)制了牵囤,
平常的值類型的賦值過程就是深復(fù)制梆奈,而引用類型的賦值就是淺復(fù)制舞骆。
既然對象是引用類型,那么它平常的賦值過程就是淺復(fù)制了,但是啊,有時(shí)候?qū)ο笠彩切枰罱坏模詹菸惹浚艺f了什么gui,是深復(fù)制亦鳞。
比如坝冕,前兩天在做Vue刹帕,遇到一個(gè)需求,要按name來排序,奇數(shù)次click就排序,偶數(shù)次click就恢復(fù)原來的按更新時(shí)間排序。這Tm還不簡單霹菊,每次都sort一下不就好了。真Tm這樣做就sb了目尖,尼瑪你想一下募书,除了第一次排序是有意義的瓤摧,第二三四五六七八……有什么意義锭部,他們都是重復(fù)的涣脚,每次sort一下不是很浪費(fèi)性能嗎!那么就該將sort后的對象存儲起來……
然后就gg了险耀,對象是引用類型累奈,一開始我直接賦值了搞乏,然后場面一度十分尷尬,數(shù)據(jù)根本不動[捂臉];
要想屬性一個(gè)一個(gè)的遞歸復(fù)制嗎?然后我的對象是類似這樣的:
握草,真遞歸復(fù)制就sb啦,好在想到個(gè)好辦法贫奠,值類型是深復(fù)制的脖律,這Tm將引用類型轉(zhuǎn)成值類型不就o了嗎[狂喜]
小二芦疏,上代碼:
function deepCopy(sender){
var temp = JSON.stringify(sender);
return JSON.parse(temp);
}
var obj_i, obj_ii = { name: 'issax' };
obj_i = deepCopy(obj_ii);
obj_i['career'] = 'coder';
console.log(obj_i); //Object {name: "issax", career: "coder"}
console.log(obj_ii); //Object {name: "issax"}
各位觀眾老爺弊决,裝逼到此結(jié)束界逛。
追加
zepto.js 和 jQuery的深復(fù)制方法溉潭,$.extend(); 默認(rèn)不是深復(fù)制