# 🏅 5/10 (一) 每日任務 Day 11
###### tags: `Vue 直播班 - 2021 夏季班`
### 物件參考觀念 (關鍵字: JS 深拷貝、淺拷貝差異)
題目 (直接貼上答案)
---
(1)
1-1. 請問以下的輸出結果為何?
1-2. 如果希望 `console.log(obj === objNew);` 的結果為 false,則可以如何修改?
```js=
let obj = {
title: '錢錢',
amounts: 66666,
}
let objNew = obj;
objNew.amounts = 123;
console.log(obj.amounts); // 輸出結果為何?
console.log(obj === objNew); // 輸出結果為 true 還是 false?
```
(2) (陷阱題!,需要用深拷貝處理)
2-1. 請問以下的輸出結果為何?
2-2. 如果希望調整 `objNew.innerObj` 時不會影響到 obj,則可以如何修改?
```js=
let obj = {
title: '錢錢',
amounts: 66666,
innerObj: {
title: '私房錢',
amounts: 1000
}
}
let objNew = {...obj};
console.log(obj === objNew); // 輸出結果為 true 還是 false?
objNew.innerObj.amounts = 2000;
console.log(obj.innerObj.amounts); // 輸出結果為何?
```
回報流程
---
請同學依照下圖教學觀看解答、回報答案:

回報格式如下圖,請在「回報區」使用註解回報答案 (為了統計人數,請同學依序加上「報數」)

<!-- 解答
(1)
1-1.
console.log(obj.amounts) // 123
console.log(obj === objNew) // true
1-2.
// 淺拷貝
可以將 let objNew = obj; 修改為
a. let objNew = {...obj};
b. let objNew = Object.assign({}, obj);
// 深拷貝
let objNew = JSON.parse(JSON.stringify(obj));
(2)
2-1.
console.log(obj === objNew); // 結果為 false
objNew.innerObj.amounts = 2000;
console.log(obj.innerObj.amounts); // 結果為 2000
2-2.
// 深拷貝
可以將 let objNew = {...obj}; 修改為
let objNew = JSON.parse(JSON.stringify(obj));
-->
回報區
---
<!--1:Alpha
(1)
1-1:
console.log(obj.amounts); // 123
console.log(obj === objNew); // true
1-2:
let objNew = Object.assign({}, obj);
(2)
2-1:
console.log(obj === objNew); // 已淺拷貝 false
console.log(obj.innerObj.amounts); // 2000
2-2:
let objNew = JSON.parse(JSON.stringify(obj));
-->
<!--2: Lina Chen
(1)
1. console.log(obj.amounts) // 123
console.log(obj === objNew) // true
2. 改成let objNew = Object.assign({}, obj);
(2)
1. console.log(obj === objNew); // false
console.log(obj.innerObj.amounts); // 2000
2. 改成let objNew = JSON.parse(JSON.stringify(obj));
-->
<!-- 3: Vic
1-1: 123、true
1-2: let objNew = {...obj};
2-1: false、2000
2-2: let objNew = JSON.parse(JSON.stringify(obj))
-->
<!--4:yijun
1-1
console.log(obj.amounts)//123
console.log(obj === objNew)//true
1-2
改成let objNew = {...obj};
2-1
console.log(obj === objNew)//false
console.log(obj.innerObj.amounts)//2000
2-2
改成let objNew = JSON.parse(JSON.stringify(obj));
-->
<!-- 5: Yiren
1-1 : 123、true
1-2 : let objNew = Object.assign({},obj);
2-1 : false、2000
2-2 : let objNew = JSON.parse(JSON.stringify(obj));
-->
<!-- 6:陳sam
1-1 :123,true
1-2 :let objNew = {...obj};
2-1 :false ,2000
2-2 :let objNew = JSON.parse(JSON.stringify(obj));
-->
<!-- 7: Sean Liu
1-1 : 123、true
1-2 : 改成let objNew = {...obj};
2-1 : false、2000
2-2 : 寫一個深烤貝的方法
function cloneObject(obj) {
if (obj === null || typeof (obj) !== 'object')
return obj;
let temp = obj.constructor(); // changed
for (let key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) {
obj['isActiveClone'] = null;
temp[key] = cloneObject(obj[key]);
delete obj['isActiveClone'];
}
}
return temp;
}
let objNew = cloneObject(obj);
// 參考資料: https://stackoverflow.com/questions/122102/what-is-the-most-efficient-way-to-deep-clone-an-object-in-javascript?page=2&tab=Votes
-->
<!-- 8: 圈圈
1-1. 請問以下的輸出結果為何? 123 true
1-2. 如果希望 console.log(obj === objNew); 的結果為 false,則可以如何修改?
let objNew = {...obj};
2-1. 請問以下的輸出結果為何?
false 2000
2-2. 如果希望調整 objNew.innerObj 時不會影響到 obj,則可以如何修改?
let objNew = JSON.parse(JSON.stringify(obj));
-->
<!-- 9:Harold
(1)
1-1. 請問以下的輸出結果為何?
- `console.log(obj.amounts);` 輸出結果:123
- `console.log(obj === objNew);` 輸出結果:true
1-2. 第五行改成`let objNew = {...obj};`
2-1. 請問以下的輸出結果為何?
- `console.log(obj === objNew);` 輸出結果:false
- `console.log(obj.innerObj.amounts);`輸出結果:2000
2-2. 第九行改成 `let objNew = JSON.parse(JSON.stringify(obj));`
-->
<!-- 10:Iven
(1)
1-1. 請問以下的輸出結果為何?
console.log(obj.amounts); //123
console.log(obj === objNew);//true
1-2. 如果希望 `console.log(obj === objNew);` 的結果為 false,該如何修改?
let objNew={...obj} 或是
let objNew=Object.assign({},obj);
(2)
2-1. 請問以下的輸出結果為何?
console.log(obj === objNew); //false
console.log(obj.innerObj.amounts);//2000
2-2. 如果希望調整 `objNew.innerObj` 時不會影響到 obj,則可以如何修改?
let objStr=JSON.stringify(obj);
let objNew=JSON.parse(objStr);
-->
<!-- 11: Sec
1-1
console.log(obj.amouts) // 123
console.log(obj === objNew); // true
1-2
let objNew = { ...obj }
2-1
console.log(obj === objNew); // false
objNew.innerObj.amounts = 2000;
console.log(obj.innerObj.amounts); // 2000
2-2
let objNew = JSON.parse(JSON.stringify(obj))
-->
<!--12: Yi Chieh
(1)
2-1:
console.log(obj.amounts); // 123
console.log(obj === objNew); // true
2-2:
let objNew = {...obj};
(2)
2-1:
console.log(obj === objNew); // false
objNew.innerObj.amounts = 2000;
console.log(obj.innerObj.amounts); // 2000
2-2:
let objNew = JSON.parse(JSON.stringify(obj));
-->
<!-- 13 youting
codepen: https://codepen.io/youtingluo/pen/ExWjRrW?editors=0011
-->
<!-- 14 小魚
1-1.請問以下的輸出結果為何?
console.log(obj.amounts) Ans:123
console.log(obj === objNew Ans:true
1-2. 如果希望 console.log(obj === objNew); 的結果為 false,則可以如何修改?
Ans: let objNew = {...obj};
2-1. 請問以下的輸出結果為何?
console.log(obj === objNew) Ans:false
console.log(obj.innerObj.amounts) Ans:2000
2-2. 如果希望調整 objNew.innerObj 時不會影響到 obj,則可以如何修改?
Ans: let objNew = JSON.parse(JSON.stringify(obj));
-->
<!-- 15 Tori
1-1.請問以下的輸出結果為何?
A:
let objNew = obj 不是複製,而是額外宣告一個 objNew 變數,並跟 obj 共用同一個記憶體位置的資料。
所以 obj.amounts 印出 123,obj === objNew 印出 true
1-2. 如果希望 console.log(obj === objNew); 的結果為 false,則可以如何修改?
A:
淺層複製(1): let objNew = {...obj}
淺層複製(2): let Object.assign({}, obj)
深層複製: let objNew = JSON.parse(JSON.stringify(obj))
2-1. 請問以下的輸出結果為何?
A:
...obj 屬於淺層拷貝,複製出來的資料會獨立存放在一個記憶體位置上,所以 obj 和 objNew 屬於不同物件,得到 false。
但是淺層拷貝只能複製第一層的屬性值,如果第一層的值屬於陣列或物件,在修改第二層屬性值時,原本被複製的資料也會被影響,所以 console.log(obj.innerObj.amounts) 得到2000。
2-2. 如果希望調整 objNew.innerObj 時不會影響到 obj,則可以如何修改?
A:
使用深層拷貝,let objNew = JOSN.parse(JSON.stringify(obj))
將原本的物件先轉換成文字,再轉換為物件,可以得到一個全新的資料
-->
<!-- 16: Jordan Tseng
1-1
console.log(obj.amouts) // 123,因為物件內容是同一個記憶體空間。
console.log(obj === objNew); // true
1-2
可以使用淺拷貝 let objNew = { ...obj }
2-1
console.log(obj === objNew); // false
console.log(obj.innerObj.amounts); // 2000因為目前只是淺拷貝,所以第二層之後的記憶體空間還是用同一個,改一個就會影響到其他的。
2-2
let objNew = JSON.parse(JSON.stringify(obj))注意這只能限用於純資料
codePen
https://codepen.io/jordan-ttc-design/pen/YzZXvML?editors=1111
-->
<!-- 17: Ethan
1-1.
console.log(obj.amounts); //123
console.log(obj === objNew); //true
1-2.
let objNew = {...obj};
2-1.
console.log(obj === objNew); //false
console.log(obj.innerObj.amounts); //2000;
2-2.
let objNew = JSON.parse(JSON.stringify(obj));
-->
<!-- 18: Alvin Chu
1-1. 請問以下的輸出結果為何?
console.log(obj.amounts); // 123
console.log(obj === objNew); // true
1-2. 如果希望 console.log(obj === objNew); 的結果為 false,則可以如何修改?
objNew = {...obj}; (展開方式屬於淺層拷貝,不影響第一層物件;第二層物件指向依然是原參考點)
2-1. 請問以下的輸出結果為何?
console.log(obj2 === obj2New); // false
console.log(obj2.innerObj.amounts); // 2000
2-2. 如果希望調整 objNew.innerObj 時不會影響到 obj,則可以如何修改?
obj2New = JSON.parse(JSON.stringify(obj2)); (轉換後為全新物件)
-->
<!-- 19: Amanda Chiang
1-1: 123, true
1-2: let objNew = Object.assign({}, obj);
1-2 原因:因 Object.assign() 僅能複製深度只有一層的屬性值。因此此種方式被稱作淺拷貝 (Shallow Copy)。
2-1: false, 2000
2-2: let objNew = JSON.parse(JSON.stringify(obj));
2-2 原因:{...obj} 為淺拷貝,得利用 JSON.parse(JSON.stringify()) 才能達到深拷貝(Deep Copy)。
-->
<!-- 19: tim Chou
1-1: 123 , true
1-2: let objNew = { ...obj };
2-1: false, 2000
2-2: let objNew2 = JSON.parse(JSON.stringify(obj));
原因: 若想複製一個物件,可以先用Jason.stringfy將物件字串化後,再parse回物件
但這種方法是無法複製物件裡的函式,因為json只能處理純資料。
-->
<!-- 20: Jack
1-1: 123 , true
1-2: let objNew = {...obj}
2-1: false, 2000
2-2: let objNew = JSON.parse(JSON.stringify(obj));
原因: {...obj}為淺層拷貝,必須要用JSON.parse(JSON.stringify())才可以深層拷貝,不會影響到obj。
-->
<!-- 21: Larry
codePen:
https://codepen.io/manpower0708/pen/ExWjpLE?editors=1111
-->
<!-- 22: Alysa Chan
Q1
1-1. 結果為123
1-2 輸出結果是true
如果想得出false,寫法如下:
let objNew = {...title};
objNew.amounts = 123;
console.log(obj.amounts); // 66666
console.log(obj === objNew) // false
Q2
2-1. 結果為false
2-2. 輸出結果是2000
如果希望調整 objNew.innerObj 時不會影響到 obj,修改方法如下:
let objNew = JSON.parse(JSON.stringify(obj));
console.log(obj === objNew); // false
objNew.innerObj.amounts = 2000;
console.log(obj.innerObj.amounts); // 輸出結果為1000
-->
<!-- 23: Poseidon
(1)
1-1:123,true
1-2:let objNew = {...title};
(2)
1-1:false,2000
1-2:let objNew =JSON.parse(JSON.stringify(obj));
-->
<!-- 24: shoppingq
codepen: https://codepen.io/shoppingq/pen/poeJZOP
-->
<!-- 25: leolee
codepen: https://codepen.io/nekorice/pen/WNpvJYJ
-->
<!-- 26: carrie
Q1
1-1. 123
1-2 true
false 輸出結果,如下:
let objNew = { ...obj }; //淺層拷貝方法 1
let objNew = Object.assign({}, obj) //淺層拷貝方法 2
Q2
2-1. false
2-2. 2000
調整 objNew.innerObj 時不會影響到 obj,如下 ::
let objNew = JSON.parse(JSON.stringify(obj));
-->
<!--27: Joe Kuo
(1)
1-1. console.log(obj.amounts) 結果為 :123
console.log(obj === objNew) 結果為 :true
1-2. let objNew = obj.assign({}, obj);
(2)
2-1. console.log(obj === objNew); 結果為: false
console.log(obj.innerObj.amounts); 結果為: 2000
2-2. let objNew = JSON.parse(JSON.stringify(obj));
-->
<!--28: Izumi 泉
https://codepen.io/izumi-dev/pen/gOgEZzM
-->
<!-- 29: Trsunyeng Yu
1-1
console.log(obj.amounts); // 123
console.log(obj === objNew); //true
1-2
// let objNew = obj; // modify to =>
let objNew = Object.assign({},obj); // ##1
let objNew = {...obj}; // ##2
let objNew = JSON.parse(JSON.stringify(obj)); // ##3
2-1
console.log(obj === objNew); // false
console.log(obj.innerObj.amounts); // 2000
2-2
//let objNew = {...obj}; // modify to =>
let objNew = JSON.parse(JSON.stringify(obj));
-->
<!-- 29: Ted Kuo
1-1
console.log(obj.amounts); // 123
console.log(obj === objNew); //true
1-2
let objNew = Object.assign({}, obj);
2-1
console.log(obj === objNew); // false
console.log(obj.innerObj.amounts); // 2000
2-2
let objNew = JSON.parse(JSON.stringify(obj));
-->
<!-- 30 Dah
1-1. 請問以下的輸出結果為何?
印出
123
true
1-2.
let objNew = obj;
修正為
let objNew = {... obj};
2-1 請問以下的輸出結果為何?
true
2000
2-2
let objNew = {...obj};
換成先轉字串再轉物件
let objNew = JSON.parse(JSON.stringify(obj));
詳細
https://codepen.io/hua0124/pen/yLMNGJv
-->
<!-- 31: Jay
1.1
console.log(obj.amounts); // 123
console.log(obj === objNew); // true
1.2 let objNew = {...obj};
2.1 console.log(obj === objNew); // false
console.log(obj.innerObj.amounts); // 2000
2.2 let objNew = JSON.parse(JSON.stringify(obj));
-->
<!-- 31: Fred Chang
1.console.log(obj.amounts); // 123
console.log(obj === objNew); // true
let objNew = {...obj};
2.console.log(obj === objNew); // false
objNew.innerObj.amounts = 2000;
console.log(obj.innerObj.amounts); //2000
let objNew = JSON.parse(JSON.stringify(obj));
-->
<!-- 32: 阿倫
1-1. 請問以下的輸出結果為何?
1. 123
2. true
1-2. 如果希望 console.log(obj === objNew); 的結果為 false,則可以如何修改?
let objNew = Object.assign({}, obj);或
let objNew = {...obj};
2-1. 請問以下的輸出結果為何?
1. false
2. 2000
2-2. 如果希望調整 objNew.innerObj 時不會影響到 obj,則可以如何修改?
let objNew=JSON.parse(JSON.stringify(obj));
-->
<!-- 33:peter.chen1024
(1)
1-1. 請問以下的輸出結果為何? 123
1-2. 如果希望 `console.log(obj === objNew);` 的結果為 false,則可以如何修改? 改淺層拷貝 let objNew = {...obj};
(2) (陷阱題!,需要用深拷貝處理)
2-1. 請問以下的輸出結果為何? 2000
2-2. 如果希望調整 `objNew.innerObj` 時不會影響到 obj,則可以如何修改? 因為淺層拷貝只有第一層不會被修改,第二層以上一樣為參考值。
可以改用深層拷貝 let objNew = JSON.parse(JSON.stringify(obj));
-->
<!-- 34:Oober
1-1.
console.log(obj.amounts) // 123
console.log(obj === objNew) // true
1-2.
//淺拷貝
let objNew = {...obj};
let objNew = object.assign({} ,obj);
//深拷貝
let objNew = JSON.parse(JSON.stringify(obj));
2-1
console.log(obj === objNew); // 結果為 false
objNew.innerObj.amounts = 2000;
console.log(obj.innerObj.amounts); // 結果為 2000
2-2
// 深拷貝
let objNew = {...obj}; 修改為
let objNew = JSON.parse(JSON.stringify(obj));
-->
<!-- 35: Erica
1-1
console.log(obj.amounts); // 123
console.log(obj === objNew); // true
1-2
a. let objNew = {...obj}
b. let objNew = Object.assign({}, obj)
2-1
console.log(obj === objNew); // false
console.log(obj.innerObj.amounts); // 2000
2-2
let objNew = JSON.parse(JSON.stringify(obj))
-->
<!-- 36: Tofu Tseng
報數兩個字突然消失 XD
1-1. 123, true
1-2. let objNew = obj;
改成:let objNew = {...obj}; 就可以了。
1-1. false
1-2. 2000
let objNew = JSON.parse(JSON.stringify(obj));
改成這樣才不會影響到,這才是實際的深拷貝。
-->
<!--37: YOYO
1-1
123,true
1-2
淺層拷貝-
way1:
let objNew = {...obj};
way2:
let objNew = Object.assign({},obj);
2-1
false,2000
2-2
深層拷貝-
第一步驟先將物件使用JSON.stringify()為字串,
第二步再將字串使用JSON.parse轉為物件
let objNew = JSON.parse(JSON.stringfy(obj));
-->
<!-- 38: Wendy Li
1-1. 請問以下的輸出結果為何?
console.log(obj.amounts); // 123
1-2. 輸出結果為 true 還是 false?
console.log(obj === objNew); // true
如果希望 console.log(obj === objNew); 的結果為 false,則可以如何修改?
let copyObj = Object.assign({}, obj)
copyObj.amounts = 123
console.log(obj === copyObj) // false
2-1. 請問以下的輸出結果為何? 輸出結果為 true 還是 false?
console.log(obj2 === objNew2); // false
2-2. 如果希望調整 objNew.innerObj 時不會影響到 obj,則可以如何修改?
方法一:
let objNew3 = JSON.parse(JSON.stringify({obj2})) // 使用偽深拷貝
方法二:
let objNew4 = cloneDeep(obj2)
function cloneDeep(obj){
if( typeof obj !== 'object' || Object.keys(obj).length === 0 ){
return obj
}
let resultData = {}
return recursion(obj, resultData)
}
function recursion(obj, data={}){
for(key in obj){
if( typeof obj[key] == 'object' && Object.keys(obj[key].length>0 )){
data[key] = recursion(obj[key])
}else{
data[key] = obj[key]
}
}
return data
}
-->
<!-- 39:RitaHuang
(1)
1-1.
console.log(obj.amounts) // 123
console.log(obj === objNew) // true
1-2.
可以將 let objNew = obj; 修改為
let objNew = {...obj};
// 深拷貝
let objNew = JSON.parse(JSON.stringify(obj));
(2)
2-1.
console.log(obj === objNew); // 結果為 false
objNew.innerObj.amounts = 2000;
console.log(obj.innerObj.amounts); // 結果為 2000
2-2.
// 深拷貝
可以將 let objNew = {...obj}; 修改為
let objNew = JSON.parse(JSON.stringify(obj));
-->
<!-- 40: Echo Hui
1-1
請問以下的輸出結果為何?
console.log(obj.amounts); // 123
console.log(obj === objNew); // true
1-2
如果希望 console.log(obj === objNew); 的結果為 false,則可以如何修改?
let objNew = Object.assign({}, obj);
2-1
請問以下的輸出結果為何?
console.log(obj === objNew); // false
console.log(obj.innerObj.amounts); // 2000
2-2
如果希望調整 objNew.innerObj 時不會影響到 obj,則可以如何修改?
let objNew = JSON.parse(JSON.stringify(obj))
-->
<!-- 41: Valerie
1-1 123, true
1-2 let objNew = {...obj}
2-1 false, 2000
2-2 let objNew = JSON.parse(JSON.stringify(obj));
-->
<!-- 42: jimmyFang
(1)
1-1:
console.log(obj.amounts); // 123
console.log(obj === objNew); // true
1-2:
淺拷貝 將 objNew 修改為以下
a. let objNew = {...obj};
b. let objNew = object.assign( {} , obj);
(2)
2-1:
console.log(obj === objNew); // false 已淺拷貝,分別為兩個存放在不同記憶體位置的物件
console.log(obj.innerObj.amounts); // 2000 淺拷貝,只能複製第一層 ,其他層仍然可以修改
2-2:
深拷貝
let objNew = JSON.parse(JSON.stringifyS(obj));
-->
<!-- 43: 涂阿銘
1-1
console.log(obj.amounts); //123
console.log(obj === objNew); //true
1-2
let objNew = {...obj}; // 改成{...obj}
2-1
console.log(obj2 === objNew2); // false
console.log(obj2.innerObj.amounts); // 2000
2-2
let objNew2 = JSON.parse(JSON.stringify(obj2)); // 改成深層複製
-->
<!-- 44: Alicia Lo
1-1:console.log(obj.amounts); // 輸出結果:123
console.log(obj === objNew); // 輸出結果:true
1-2:objNew = {...obj};//使用淺層拷貝
objNew.amounts = 123;
console.log(obj === objNew);// 輸出結果:false
2-1:console.log(obj === objNew); // 輸出結果:false
console.log(obj.innerObj.amounts); // 輸出結果:2000
2-2:
let objNew= (JSON.parse(JSON.stringify(obj)));//先轉成字串,破壞傳參考特性,再轉回物件
objNew.innerObj.amounts = 2000;
console.log(obj.innerObj.amounts); //輸出結果:1000
-->
<!-- 45: Ed Huang
1-1. 請問以下的輸出結果為何?
console.log(obj.amounts); //123
1-2. 如果希望 console.log(obj === objNew); 的結果為 false,則可以如何修改?
let objNew = {...obj}; // 展開 淺拷貝
console.log(obj === objNew); //false
2-1. 請問以下的輸出結果為何?
console.log(obj.innerObj.amounts); // 2000
2-2. 如果希望調整 objNew.innerObj 時不會影響到 obj,則可以如何修改?
let objNew = JSON.parse(JSON.stringify(obj)); // 深層拷貝
-->
<!-- 46: Eric-小偉哥
(1-1)
console.log(obj.amounts); //123
console.log(obj === objNew); //true
(1-2) 將第5行改為
(a)let objNew = {...obj};
(b) let objNew = Object.assign({}, obj);
(2-1)
console.log(obj === objNew); //false
console.log(obj.innerObj.amounts); //2000
(2-2) 利用深拷貝修正,如下第一行
```javascript=
let objNew = JSON.parse(JSON.stringfy(obj)); //<-- 利用深拷貝修正
console.log(obj === objNew); // 輸出結果為 true 還是 false?
objNew.innerObj.amounts = 2000;
console.log(obj.innerObj.amounts); // 輸出結果為何?
```
--->
<!-- 47: Wei
(1)
1-1. 請問以下的輸出結果為何?
console.log(obj.amounts); // 123
console.log(obj === objNew); // true
1-2. 如果希望 console.log(obj === objNew); 的結果為 false,則可以如何修改?
let objNew = {...obj}; //複製一個全新的物件 淺拷貝
(2)
2-1. 請問以下的輸出結果為何?
console.log(obj === objNew); // false?
console.log(obj.innerObj.amounts); // 2000
2-2. 如果希望調整 objNew.innerObj 時不會影響到 obj,則可以如何修改?
let objNew = JSON.parse(JSON.stringify(obj)); //深拷貝
-->
<!--48:Chiang
(1)
1-1:
console.log(obj.amounts); // 123
console.log(obj === objNew); // true
1-2:
let objNew = Object.assign({}, obj);
(2)
2-1:
console.log(obj === objNew); // false
console.log(obj.innerObj.amounts); // 2000
2-2:
let objNew = JSON.parse(JSON.stringify(obj));
-->
<!--49:Carol
(1)1-1. 123
(1)1-2. let objNew = {...obj};
(2)2-1. false
(2)2-2. objNew.innerObj = {...obj.innerObj};
-->
<!-- 50: Echo
1-1. 請問以下的輸出結果為何? 123
1-2. 如果希望 console.log(obj === objNew); 的結果為 false,則可以如何修改?
let objNew = Object.assign({},obj);
console.log(obj === objNew); //false
2-1. 請問以下的輸出結果為何? 2000
2-2. 如果希望調整 objNew.innerObj 時不會影響到 obj,則可以如何修改?
let objNew = JSON.parse(JSON.stringify(obj));
-->
<!-- 51:Eva lin
1.1 console.log(obj.amounts); //123
console.log(obj === objNew); //true
1.2 let objNew ={...obj}; //淺拷貝
2.1 2000
2.2 let objNew = JSON.parse(JSON.stringify(obj));
<!-- 52: Jessie Cheng
1-1. 123 true
1-2. let objNew = Object.assign({}, obj);
2-1. false 2000
2-2. objNew.innerObj = { ...obj.innerObj };
-->
<!-- 53:Stacey Huang
1-1. 請問以下的輸出結果為何?
A:123; true;
1-2. 如果希望 console.log(obj === objNew); 的結果為 false,則可以如何修改?
A:let objNew = {...obj};
2-1. 請問以下的輸出結果為何?
A:false ; 2000
2-2. 如果希望調整 objNew.innerObj 時不會影響到 obj,則可以如何修改?
A:let objNew = JSON.parse(JSON.stringify(obj))
-->
<!--54:Jrhung-Tsai
1-1
console.log(obj.amounts); //123
console.log(obj === objNew); //true
1-2
let objNew = {...obj};
2-1
console.log(obj === objNew); //false
console.log(obj.innerObj.amounts); //2000
2-2
改成let objNew = JSON.parse(JSON.stringify(obj));
-->
<!-- 55: Eyan
(1)
1-1:
console.log(obj.amounts); // 123
console.log(obj === objNew); // true
1-2:
let objNew = Object.assign({}, obj);
(2)
2-1:
console.log(obj === objNew); // false
console.log(obj.innerObj.amounts); // 2000
2-2:
let objNew = JSON.parse(JSON.stringify(obj));
-->
<!-- 56: Lin
(1)
1-1:
console.log(obj.amounts); // 123
console.log(obj === objNew); // true
1-2:
let objNew = {...obj};
(2)
2-1:
console.log(obj === objNew); // false
console.log(obj.innerObj.amounts); // 2000
2-2:
let objNew = JSON.parse(JSON.stringify(obj));
-->
<!-- 57: 李重炫
(1)
1-1:
console.log(obj.amounts); // Ans:123
console.log(obj === objNew); // Ans:true
1-2:
let objNew = {...obj};
(2)
2-1:
console.log(obj === objNew); // Ans:false
console.log(obj.innerObj.amounts); // Ans:2000
2-2:
let objectNew = JSON.parse(JSON.stringfy(obj));
-->
<!-- 58: twoz
(1)
1-1:
console.log(obj.amounts); // Ans:123
console.log(obj === objNew); // Ans:true
1-2:
let objNew = {...obj};
(2)
2-1:
console.log(obj === objNew); // Ans:false
console.log(obj.innerObj.amounts); // Ans:2000
2-2:
let objectNew = JSON.parse(JSON.stringfy(obj));
-->
<!-- 59: 家齊
1-1:console.log(obj.amounts); //123
console.log(obj === objNew); //true,因為objNew為新設的變數與原本的物件共同取用同記憶體位置的資料
1-2: (1)用淺拷貝: objNew = {...obj};
(2)用深拷貝: objNew = JSON.parse(JSON.stringify(obj));
2-1: console.log(obj === objNew); //false
objNew.innerObj.amounts = 2000;
console.log(obj.innerObj.amounts); //2000,因為用淺拷貝,只複製一層物件,若有第二層則仍與原本記憶體位置共享
2-2: 用深拷貝:let objNew = Json.parse(Json.stringify(obj));
-->
<!-- 60:Allen chou
let obj = {
title: '錢錢',
amounts: 66666,
}
let objNew = obj;
objNew.amounts = 123;
console.log(obj.amounts); // 輸出結果為何?
->123
console.log(obj === objNew); // 輸出結果為 true 還是 false?
->true
1-2. 如果希望 console.log(obj === objNew); 的結果為 false,則可以如何修改?
objNew = {...obj};//淺
objNew =JSON.parse(JSON.stringify(obj));//深
objNew = Object.assign({}, obj);//淺
2-1. 請問以下的輸出結果為何?
2-2. 如果希望調整 objNew.innerObj 時不會影響到 obj,則可以如何修改?
let obj = {
title: '錢錢',
amounts: 66666,
innerObj: {
title: '私房錢',
amounts: 1000
}
}
let objNew = {...obj};
console.log(obj === objNew); // 輸出結果為 true 還是 false? //true
objNew.innerObj.amounts = 2000;
console.log(obj.innerObj.amounts); // 輸出結果為何? 2000
use->objNew =JSON.parse(JSON.stringify(obj));//深
-->
<!-- 61:林晉
1-1. 123
console.log(obj === objNew); // 輸出結果為 true 還是 false?
true
1-2: let objNew = {...obj};
2-1. false
2000
2-2. let objNew = JSON.parse(JSON.stringify(obj));
-->
<!-- 62:Carol
(1)1-1.
123,true
(1)1-2.
第5行改成
let objNew = {…obj};
(2)
2-1. false,2000
2-2.
第9行改成
let objNew = {...obj};
objNew. innerObj = {...obj. innerObj};
-->
<!-- 63:moitw
(1) 123, true
let objNew = {...obj} ;
(2)
2-1 2000, false
2-2 let objNew = JSON.parse(JSON.stringify(obj));
-->
<!-- 64: Emily Hsi
(1)
1-1
console.log(obj.amounts); // 123
console.log(obj === objNew); // true
1-2
let objNew = Object.assign({}, obj);
(2)
2-1
console.log(obj === objNew); // false
console.log(obj.innerObj.amounts); // 2000
2-2
let objNew = JSON.parse(JSON.stringify(obj));
-->
<!-- 65: Amber
1-1 :
console.log(obj.amounts)//123
console.log(obj === objNew)//true
1-2:
let objNew = {...obj};
2-1:
console.log(obj === objNew)//false
console.log(obj.innerObj.amounts)//2000
2-2:
let objNew = JSON.parse(JSON.stringify(obj));
-->
<!-- 66:MM
1-1:123、true
1-2:let objNew = { .. obj };
2-1:falsue、2000
2-2:
let objNew = JSON.parse(JSON.stringify(obj));
let objNew = JSON.parse(JSON.stringify(obj));
-->