4 回答

TA貢獻1784條經驗 獲得超2個贊
無論是...還是assign都是淺拷貝,什么是淺拷貝,顧名思義就是只拷貝第一層屬性,如果第一層屬性的值為一個引用類型的數據,那么復制的就是這個數據的地址,也就是并沒有把數據本身拷貝過來,只是說我記住你了,有事我再找你。
第一個例子中a屬性是一個對象,拷貝過來后改變這個數據的值,那么就相當于改變了原數據
第二個例子中a屬性是一個namber類型的值,不是引用類型的,所以直接拷貝過來,改變值后,源對象不會跟著改變
...
是ES6新出現的一種運算符,名為解構。詳細的可以看阮一峰老師的ECMAScript 6 入門
顧名思義就是分解一個數據的結構,那么什么數據可以被分解?
所有可被遍歷的數據(具有Iterator 接口的對象),如對象、數組、Map、Set、argument,另外字符串也可以結構(某種意義上字符串可以理解為數組)。
結構一個數據后得到了什么?
這就要講到數據的遍歷了,你可以把結構理解為遍歷取值,可是也不是什么值都取的。就拿object來說,使用for...in來遍歷,得到的是所有可枚舉的共有的屬性,而使用結構來結構一個對象,得到的是所有可枚舉的私有的屬性,這點要知道。
結構最常用的兩個地方,一是結構賦值,一是結構復制。其基本原理都是遍歷取值。

TA貢獻2036條經驗 獲得超8個贊
origin = {
name: "James",
hello: "World",
child: {}
};
const a = origin;
const b = { ...origin };
console.log(a === origin, a);
console.log(b === origin, b);
console.log(b.child === origin.child);
true { name: 'James', hello: 'World', child: {} }
false { name: 'James', hello: 'World', child: {} }
true
所以擴展運算符干了什么——淺復制(最后那個 true 輸出說明了 child 未被復制)
添加回答
舉報