阿西河

所有教程

公众号
🌙
阿西河前端的公众号

我的收藏

    最近访问  (文章)

    教程列表

    数据库
    抓包专区
    测试专区

    CoffeeScript 克隆对象(深度复制)

    克隆对象(深度复制)

    问题

    你想复制一个对象,包含其所有子对象。

    解决方案

    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
    

    讨论

    通过赋值来复制对象与通过克隆函数来复制对象的区别在于如何处理引用。赋值只会复制对象的引用,而克隆函数则会:

    • 创建一个全新的对象
    • 这个新对象会复制原对象的所有属性,
    • 并且对原对象的所有子对象,也会递归调用克隆函数,复制每个子对象的所有属性。

    下面是一个通过赋值来复制对象的例子:

    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。

    卖前端学习教程

    只需几十元,就能买到培训班的内部教程!开启高薪之路!

    零基础小白阿里P7的教程都有!

    同时长期收购所有培训班的前端教程

    目录
    目录