在使用JavaScript對數組進行操作的時候,我們經常需要將數組進行備份,事實證明如果只是簡單的將它賦予其他變量,那么我們只要更改其中的任何一個,然后其他的也會跟着改變,這就導致了問題的發生。
參考Object.assign():https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
<!DOCTYPE html>
<html>
<head>
<title>測試深拷貝,淺拷貝方法及現象</title>
</head>
<body>
<script type="text/javascript">
//Object.assign()方法是淺拷貝
var myobject={
a:"a",
b:"b",
c:"c",
}
var newobject=Object.assign({},myobject);
newobject.a=222;
document.writeln("原始:"+JSON.stringify(myobject));
document.writeln("現在:"+JSON.stringify(newobject));
function test() {
'use strict';
let obj1 = { a: 0 , b: { c: 0}};
let obj2 = Object.assign({}, obj1);
console.log(JSON.stringify(obj2)); // { a: 0, b: { c: 0}}
obj1.a = 1;
console.log(JSON.stringify(obj1)); // { a: 1, b: { c: 0}}
console.log(JSON.stringify(obj2)); // { a: 0, b: { c: 0}}
obj2.a = 2;
console.log(JSON.stringify(obj1)); // { a: 1, b: { c: 0}}
console.log(JSON.stringify(obj2)); // { a: 2, b: { c: 0}}
obj2.b.c = 3;
console.log(JSON.stringify(obj1)); // { a: 1, b: { c: 3}}
console.log(JSON.stringify(obj2)); // { a: 2, b: { c: 3}}
// Deep Clone
//利用json方法是深復制,但要JSON安全
obj1 = { a: 0 , b: { c: 0}};
let obj3 = JSON.parse(JSON.stringify(obj1));
obj1.a = 4;
obj1.b.c = 4;
console.log(JSON.stringify(obj3)); // { a: 0, b: { c: 0}}
}
test();
</script>
<!-- <script type="text/javascript">
//這是淺拷貝,該變拷貝的對象會改變原始對象的值
var arr = ["One","Two","Three"];
var arrto = arr;
arrto[1] = "test";
document.writeln("數組的原始值:" + arr + "<br />");//Export:數組的原始值:One,test,Three
document.writeln("數組的新值:" + arrto + "<br />");//Export:數組的新值:One,test,Three
</script>
-->
<!-- <script type="text/javascript">
//這是深拷貝,該變現有對象不會改變原始對象的值
var arr = ["One","Two","Three"];
var arrtoo = arr.slice(0);
arrtoo[1] = "set Map";
document.writeln("數組的原始值:" + arr + "<br />");//Export:數組的原始值:One,Two,Three
document.writeln("數組的新值:" + arrtoo + "<br />");//Export:數組的新值:One,set Map,Three
</script> -->
<!-- <script type="text/javascript">
//這是深拷貝
var arr = ["One","Two","Three"];
var arrtooo = arr.concat();
arrtooo[1] = "set Map To";
document.writeln("數組的原始值:" + arr + "<br />");//Export:數組的原始值:One,Two,Three
document.writeln("數組的新值:" + arrtooo + "<br />");//Export:數組的新值:One,set Map To,Three
</script> -->
<!-- <script type="text/javascript">
//深拷貝,json方法是深拷貝
var someobj={
a:"a",
b:"b",
c:"c"
}
var newobject=JSON.parse(JSON.stringify(someobj));
someobj.a="aaaa";
document.writeln("原始:"+JSON.stringify(someobj)+"<br/>");
document.writeln("現在:"+JSON.stringify(newobject)+"<br/>");
//原始:{"a":"aaaa","b":"b","c":"c"}
// 現在:{"a":"a","b":"b","c":"c"}
</script> -->
</body>
</html>
這里只是淺嘗輒止,以后還會繼續探究。
總結:淺拷貝Object.assign(),
深拷貝用JSON.parse(JSON.stringify(someobj));(缺點:只能拷貝純json的,不能拷貝包含函數的對象)
但要保證someobj是json安全的,符合json規則。
淺拷貝的影響,要用深拷貝的地方:如一個表格,點擊一行進行編輯,當彈出框中input輸入框值變化,表格數據也會跟着變化。事實上,我們要的是,只有提交了,重新刷新,表格這個數據才會變化。
