1、JavaScript的數(shù)據(jù)類(lèi)型:基本數(shù)據(jù)類(lèi)型、引用數(shù)據(jù)類(lèi)型。
基本數(shù)據(jù)類(lèi)型:保存在棧內(nèi)存的簡(jiǎn)單數(shù)據(jù)段(undefined,boolean,number,string,null)。
引用數(shù)據(jù)類(lèi)型:Array,對(duì)象,F(xiàn)unction保存在堆內(nèi)存中。
淺拷貝:只復(fù)制指向某個(gè)對(duì)象的指針,而不復(fù)制對(duì)象本身,新舊對(duì)象共享一塊內(nèi)存
深拷貝:復(fù)制并創(chuàng)建一個(gè)一摸一樣的對(duì)象,不共享內(nèi)存,修改新對(duì)象,舊對(duì)象保持不變
2 、遞歸的方法實(shí)現(xiàn)深拷貝
functiondeepclone(obj){
? ? ? ? let objClone = Array.isArray(obj) ? [] : {};
? ? ? ? if (obj && typeof obj === "object") {
? ? ? ? ? ? for (key in obj) {
? ? ? ? ? ? ? ? //if (obj.hasOwnProperty(key)) {? //也可以不加??
????????????????????????if (obj[key] && typeof obj[key] === "object") {
? ? ? ? ? ? ? ? ? ? ? ? ????objClone[key] = deepclone(obj[key])
? ? ? ? ? ? ? ? ? ? ????} else {
? ? ? ? ? ? ? ? ? ? ? ? ????objClone[key] = obj[key]
? ? ? ? ? ? ? ? ? ????? }
? ? ? ? ? ? ? ? ????//}? ? ? ? ? ?
?????????????}
? ? ? ? }
? ? ? ? return objClone
? ? }
? ? var a = [1, 2, 3, 4];
? ? var b = deepclone(a);
? ? a[0] = 8? ? console.log(a, b);
Array.isArray(obj):ECMAScript 5.1 (ECMA-262)? ?考慮到的兼容性,可以用下面的方法實(shí)現(xiàn)較好的兼容
? ?if (!Array.isArray) {
? ? ? Array.isArray = function(arg) {
? ? ????????return Object.prototype.toString.call(arg) === '[object Array]';
? ? ? ?};
????}
3、用JSON.stringify把對(duì)象轉(zhuǎn)成字符串,再用JSON.parse把字符串轉(zhuǎn)成新的對(duì)象
functiondeepclone(obj){
? ? ? var _obj = JSON.stringify(obj);
? ? ? var cloneObj = JSON.parse(_obj);
? ? ? return cloneObj
? ? }
? ? var a =[1,2,3,4];
? ? var b= deepclone(a);
? ? a[0]=8? ? console.log(a,b);