CoffeeScript 克隆對(duì)象(深度復(fù)制)

2022-06-29 16:46 更新

克隆對(duì)象(深度復(fù)制)

問題

你想復(fù)制一個(gè)對(duì)象,包含其所有子對(duì)象。

解決方案

clone = (obj) ->
  if not obj? or typeof obj isnt 'object'
    return obj

  if obj instanceof Date
    return new Date(obj.getTime()) 

  if obj instanceof RegExp
    flags = ''
    flags += 'g' if obj.global?
    flags += 'i' if obj.ignoreCase?
    flags += 'm' if obj.multiline?
    flags += 'y' if obj.sticky?
    return new RegExp(obj.source, flags) 

  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

討論

通過賦值來復(fù)制對(duì)象與通過克隆函數(shù)來復(fù)制對(duì)象的區(qū)別在于如何處理引用。賦值只會(huì)復(fù)制對(duì)象的引用,而克隆函數(shù)則會(huì):

  • 創(chuàng)建一個(gè)全新的對(duì)象
  • 這個(gè)新對(duì)象會(huì)復(fù)制原對(duì)象的所有屬性,
  • 并且對(duì)原對(duì)象的所有子對(duì)象,也會(huì)遞歸調(diào)用克隆函數(shù),復(fù)制每個(gè)子對(duì)象的所有屬性。

下面是一個(gè)通過賦值來復(fù)制對(duì)象的例子:

x =
  foo: 'bar'
  bar: 'foo'

y = x

y.foo = 'test'

console.log x.foo isnt y.foo, x.foo, y.foo
# => false, test, test

顯然,復(fù)制之后修改y也就修改了x。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)