Please note, this is a STATIC archive of website developer.mozilla.org from November 2016, cach3.com does not collect or store any user information, there is no "phishing" involved.

结构化克隆算法

这篇文章需要技术复核。如何帮忙。

这篇文章需要文法复核。如何帮忙。

翻译正在进行中。

结构化克隆算法是一种由 HTML5 规范 定义的新算法,用来序列化复杂的 JavaScript 对象。相比 JSON,它对包含着循环图的对象序列化有着更好的支持——对象可以引用指向同一图中的其他的对象的对象。此外,在某些情况下,结构化克隆算法可能会比 JSON 有着更高的效率。

算法本质上是将原始对象的所有字段的值复制到新对象里。如果一个字段是对象,这些字段会被递归复制,直到所有的字段和子字段都被复制进新的对象里。

优于 JSON 的地方

以下是结构化克隆算法相对 JSON 的一些关键优点:

  • 结构化克隆可以复制 RegExp 对象。
  • 结构化克隆可以复制 BlobFile 以及 FileList 对象。
  • 结构化克隆可以复制 ImageData 对象。CanvasPixelArray 的克隆粒度将会跟原始对象相同,并且复制出来相同的像素数据。
  • 结构化克隆可以正确的复制有循环引用的对象

结构化克隆所不能做到的

  • Error 以及 Function 对象是不能被结构化克隆算法复制的;如果你尝试这样子去做,这会导致抛出 DATA_CLONE_ERR 的异常。
  • 企图去克隆 DOM 节点同样会抛出 DATA_CLONE_ERROR 异常。
  • 对象的某些特定参数也不会被保留
    • RegExp 对象的 lastIndex 字段不会被保留
    • 属性描述符,setters 以及 getters(以及其他类似元数据的功能)同样不会被复制。例如,如果一个对象用属性描述符标记为 read-only,它将会被复制为 read-write,因为这是默认的情况下。
    • 原形链上的属性也不会被追踪以及复制。

支持的种类

Object type Notes
All primitive types However not symbols
Boolean object  
String object  
Date  
RegExp The lastIndex field is not preserved.
Blob  
File  
FileList  
ArrayBuffer  
ArrayBufferView This basically means all typed arrays like Int32Array etc.
ImageData  
Array  
Object This just includes plain objects (e.g. from object literals)
Map  
Set  

另一种方法:深复制

如果你想深复制一个对象(那就是沿着原形链,对所有属性进行递归复制),你必须要用另外一种方法。以下是一个可行的例子。

function clone(objectToBeCloned) {
  // Basis.
  if (!(objectToBeCloned instanceof Object)) {
    return objectToBeCloned;
  }

  var objectClone;
  
  // Filter out special objects.
  var Constructor = objectToBeCloned.constructor;
  switch (Constructor) {
    // Implement other special objects here.
    case RegExp:
      objectClone = new Constructor(objectToBeCloned);
      break;
    case Date:
      objectClone = new Constructor(objectToBeCloned.getTime());
      break;
    default:
      objectClone = new Constructor();
  }
  
  // Clone each property.
  for (var prop in objectToBeCloned) {
    objectClone[prop] = clone(objectToBeCloned[prop]);
  }
  
  return objectClone;
}
  Note: This algorithm actually implements only RegExp, Array, and Date special objects. You can implement other special cases depending on your needs.

See also

文档标签和贡献者

 此页面的贡献者: liuqipeng417, FredWe
 最后编辑者: liuqipeng417,