淺拷貝:淺拷貝只是複製了記憶體位址,如果原位址中的物件改變了,淺拷貝出來的物件也會相應改變。淺拷貝陣列(只拷貝第一級陣列):深拷貝:開闢了一塊新的記憶體存放位址和位址指向的物件,原位址的任何物件改變了,深拷貝出來的物件不變。
1.直接遍歷
var arr = [1,2,3,4];
function
copy(arg)
return newarr;
}var newarry = copy(arr);
console.log(newarry);
newarry[0] = 10;
console.log(newarry); // [10,2,3,4]
console.log(arr) // [1,2,3,4]
複製**
2.slicevar arr = [1,2,3,4]
var copyarr = arr.slice();
copyarr[0] = 10;
console.log(copyarr); // [10,2,3,4]
console.log(arr); // [1,2,3,4]
複製**
slice(start,end),當slice()
方法返回乙個陣列中複製出來的元素組成新陣列,start
指起始元素下標,end指終止元素下標
slice()
不帶任何引數時,預設返回乙個和原陣列一樣的新陣列
3.concat()
var arr = [1,2,3,4]
var copyarr = arr.concat();
copyarr[0] = 10;
console.log(copyarr); // [10,2,3,4]
console.log(arr); // [1,2,3,4]
複製**
array.concat(array1,array2,.......,arrayn),concat()
方法用於連線兩個或多個陣列(不會改變原陣列,返回被連線陣列的副本)
然而如果第一級陣列元素是物件或陣列,上面三種方式都失效:var arr = [
, ,
]var copyarr = arr.slice();
copyarr[0].number = 10;
console.log(copyarr); // [, ,]
console.log(arr); // [, , ]
複製**
淺拷貝物件(如果物件中的值不為陣列或物件)
1.直接遍歷
var obj =
function
copy (arg)
for(let item in arg)
return newobj;
} var copyobj = copy(obj)
copyobj.name = "李四"
console.log(copyobj) //
console.log(obj) //
複製**
2.es6的object.assignvar obj =
var copyobj = object.assign({},obj)
copyobj.name = '李四'
console.log(copyobj) //
console.log(obj) //
複製**
object.assign:用於物件的合併,將源物件3.es6擴充套件運算子(source)
的所有可列舉屬性,複製到目標物件(target)
,並返回合併後的target
用法:object.assign(target, source1, source2); 所以copyobj = object.assign({}, obj); 這段**將會把
obj
中的一級屬性都拷貝到{}
中,然後將其返回賦給copyobj
var obj =
var copyobj =
copyobj.name = '李四'
console.log(copyobj)
console.log(obj)
複製**
擴充套件運算子(...)
用於取出引數物件的所有可遍歷屬性,拷貝到當前物件之中
深拷貝
json.stringify()
和json.parse()
用json.stringify
把物件轉成字串,再用json.parse
把字串轉成新的物件。
但是這種方法也有不少壞處,譬如它會拋棄物件的constructor
。也就是深拷貝之後,不管這個物件原來的建構函式是什麼,在深拷貝之後都會變成object
。
這種方法能正確處理的物件只有number
,string
,boolean
,array
, 扁平物件,即那些能夠被json
直接表示的資料結構。regexp
物件是無法通過這種方式深拷貝。
也就是說,只有可以轉成json
格式的物件才可以這樣用,像function
、undefined
、symbol
、迴圈引用的物件沒辦法轉成json
。
var obj1 = };
var obj2 = json.parse(json.stringify(obj1));
console.log(typeof obj1.fun);
// 'function'
console.log(typeof obj2.fun);
// 'undefined' <-- 沒複製
複製**
使用遞迴函式實現乙個深拷貝的方法:function
deepclone(obj) ;
if(obj && typeof obj === "object") else }}
}return objclone
} 複製**
javaScript淺拷貝 深拷貝
資料型別 js的資料型別有兩種 1.基本資料型別 數值 字串 布林 null undefined 值型別 存放在棧中,所以複製基本資料型別的值是會新開乙個棧記憶體 淺拷貝 如果我們要複製物件的所有屬性都不是引用型別時,就可以使用淺拷貝,實現方式就是遍歷並複製,最後返回新的物件。深拷貝 深度拷貝就是把...
javaScript淺拷貝 深拷貝
資料型別 js的資料型別有兩種 1.基本資料型別 數值 字串 布林 null undefined 值型別 存放在棧中,所以複製基本資料型別的值是會新開乙個棧記憶體 淺拷貝 如果我們要複製物件的所有屬性都不是引用型別時,就可以使用淺拷貝,實現方式就是遍歷並複製,最後返回新的物件。深拷貝 深度拷貝就是把...
javascript 淺拷貝和深拷貝
簡單的賦值就是淺拷貝。因為物件和陣列在賦值的時候都是引用傳遞。賦值的時候只是傳遞乙個指標。看下面的例項 var a 1,2,3 var b a var test var c test console.log a console.log b console.log test console.log b...