### JavaScript中如何克隆一個對象?
#### Answer
使用對象擴展運算符`...`,對象的自身可枚舉屬性會被復制到新對象中。這是一個對象的淺復制
const obj = { a: 1, b: 2 }
const shallowClone = { ...obj }
使用這項技術,原型會被忽略。除此之外,嵌套的對象不會被復制,但是相反的它們的引用會被復制,因此嵌套對象還是會引用原始的那個同一個對象。深克隆比淺克隆要更復雜,因為需要有效地克隆任何類型的對象(Date,RegExp,Function,Set等等),而且它們可能都是嵌套對象。
其他可選用的方法包括:
* `JSON.parse(JSON.stringify(obj))`可以被用來深克隆一個對象,但是它是cpu密集型操作而且只接受有效的JSON格式(因此它會去掉函數而且不允許循環引用)
* `Object.assign({}, obj)`是另外一個淺克隆方法
* `Object.keys(obj).reduce((acc, key) => (acc[key] = obj[key], acc), {})`一個更冗長的替代方法展示了更深層的概念
#### Good to hear
* JavaScript傳遞對象的時候傳遞的是引用,意味着嵌套對象復制的時候復制的是引用而不是值
* 同樣的方法可以被用來合並兩個對象
##### Additional links