深度克隆的最简单实现

1,984 阅读1分钟
原文链接: github.com

深浅拷贝

... 巴拉巴拉 ...

实现

看见有很多人分享他们的实现方式,五花八门,各显神通。

我也分享两种简单酷炫的方式:

1. 利用 history API 实现结构化克隆

/*structuralClone easy way*/
const structuralClone = obj => {
    const oldState = history.state;
    history.replaceState(obj, document.title);
    const copy = history.state;
    history.replaceState(oldState, document.title);
    /* 可以在这里进行原型、DOM、Function 等不支持的类型的完善 */
    /* 不过基本就够用了 */
    /* copy = morePerfectCopy(copy) */
    return copy;
}

原谅我标题党。

其实这是一种结构化克隆的实现, 这里只是讨巧的使用了 H5 history api 中,在 replaceState 或者 pushState 的时候对 state 是采用 H5 实现的结构化克隆进行序列化后然后进行安全的传递这一特性。

目前支持的类型有:

  • 除 symbols 之外的所有原始类型
  • Boolean 对象
  • String 对象
  • Date
  • RegExp (lastIndex 字段不会被保留。)
  • Blob
  • File
  • FileList
  • ArrayBuffer
  • ArrayBufferView
  • ImageData
  • Array
  • Object
  • Map
  • Set

不支持:

  • 原型链
  • Error 对象
  • Function
  • DOM

2. Notification API

const deepCloneByNotificationAPI = obj => {
    return new Notification('', {data: obj, silent: true}).data;
}

这个其实也是利用 web workers 中的传递的对象也是结构化克隆算法实现的特性。

与上面的方式异曲同工,只是这个更加简洁,但是支持率很低,在 chrome 上是可以跑的。

这两种方式的性能,你们可以自己跑一跑,应该是凑合的。