CoffeeScript攻略2.1:克隆物件(深複製)
問題
你想複製一個物件,包含其所有子物件。
方案
clone = (obj) ->
if not obj? or typeof obj isnt 'object'
return obj
newInstance = new obj.constructor()
for key of obj
newInstance[key] = clone obj[key]
return newInstance
x =
foo: 'bar'
bar: 'foo'
y = clone(x)
y.foo = 'test'
console.log x.foo isnt y.foo, x.foo, y.foo
# => true, bar, test
討論
通過賦值來複制物件與通過克隆函式來複制物件的區別在於如何處理引用。賦值只會複製物件的引用,而克隆函式則會建立一個全新的物件,這個新物件會複製原物件的所有屬性,並且對原物件的所有子物件,也會遞迴呼叫克隆函式,複製每個子物件的所有屬性。
下面是一個通過賦值來複制物件的例子:
x =
foo: 'bar'
bar: 'foo'
y = x
y.foo = 'test'
console.log x.foo isnt y.foo, x.foo, y.foo
# => false, test, test
顯然,複製之後修改y也就修改了x。
相關文章
- js 淺拷貝(淺複製、淺克隆)、深拷貝(深複製、深克隆)JS
- JS物件深度克隆/複製JS物件
- js物件深複製JS物件
- JS物件複製:深複製和淺複製JS物件
- CoffeeScript攻略3.1:重複字串字串
- JavaScript深層克隆物件JavaScript物件
- vue物件的深層複製Vue物件
- CoffeeScript攻略2.5:鏈式呼叫物件物件
- js之物件深淺克隆JS物件
- JS 物件如何實現深複製JS物件
- 對於複製普通物件 深複製和淺複製是否一樣物件
- 淺談JS中物件的淺複製和深複製JS物件
- Java中物件的深複製和淺複製詳解Java物件
- js 實現深複製/深複製JS
- 原生js實現物件的深克隆以及淺克隆JS物件
- es6完全深複製一個物件物件
- Java引用複製、淺複製、深複製Java
- JavaScript 淺複製和深複製JavaScript
- 【web前端】用javascript實現物件的深複製Web前端JavaScript物件
- [分享]javascript 陣列以及物件的深拷貝(複製陣列或複製物件)的方法JavaScript陣列物件
- go slice深複製和淺複製Go
- c#淺複製與深複製C#
- JavaScript中的淺複製與深複製JavaScript
- Vue實現對陣列、物件的深拷貝、複製Vue陣列物件
- CoffeeScript攻略1.1:嵌入JavaScriptJavaScript
- CoffeeScript攻略1.3:for迴圈
- CoffeeScript攻略3.7:拆分字串字串
- CoffeeScript攻略3.9:匹配字串字串
- 複製物件物件
- js中深克隆與淺克隆JS
- java深克隆(深拷貝)和淺克隆(淺拷貝)Java
- CoffeeScript攻略2.2:建立一個不存在的物件字面值物件
- 詳談Javascript中的深複製和淺複製JavaScript
- Python 列表切片陷阱:引用、複製與深複製Python
- CoffeeScript攻略3.8:字串插值字串
- 克隆資料庫之RMAN複製(二)資料庫
- 克隆資料庫之RMAN複製(一)資料庫
- 深入剖析 JavaScript 的深複製JavaScript