¿Cuál es la forma más eficiente de clonar en profundidad un objeto en JavaScript?

2022-04-07 19:24:29

Las respuestas a esta pregunta son un esfuerzo de la comunidad. Edite las respuestas existentes para mejorar esta publicación. Actualmente no acepta nuevas respuestas o interacciones.
, pero obj = JSON.parse(JSON.stringify (o)); pero cuestionan la eficiencia.

También he visto funciones de copia recursivas con varios defectos.
Me sorprende que no exista una solución canónica.

- jschrab

Source
zh
Responder


5173
  • Clonación profunda nativa

    Ahora hay un estándar JS llamado "clonación estructurada" , que funciona de forma experimental en Node 11 y versiones posteriores, llegará a los navegadores y tiene polyfills para sistemas existentes.

    clon estructurado(valor)
    

    Si es necesario, carga primero el polyfill:

    importar clon estructurado desde '@ungap/clon estructurado';
    

    Consulte esta respuesta para más detalles.

    Respuestas anteriores

    Clonación rápida con pérdida de datos - JSON.parse/stringify

    s, funciones, undefined, Infinity, RegExps, Maps, Sets, Blobs, FileLists, ImageDatas, matrices dispersas, matrices tipificadas u otros tipos complejos dentro de su objeto, una línea muy simple para clonar en profundidad un objeto es:

    JSON.parse(JSON.stringify(objeto))

    const a = {
      cadena: 'cadena',
      número: 123,
      bool: falso,
      nulo: nulo,
      fecha: nueva fecha (), // en cadena
      undef: indefinido, // perdido
      inf: Infinity, // forzado a 'null'
      re: /.*/, // perdido
    }
    consola.log(a);
    console.log(tipo de una.fecha); // Objeto de fecha
    const clonar = JSON.parse(JSON.stringify(a));
    consola.log(clonar);
    console.log(tipo de clon.fecha); // resultado de .toISOString()

    Consulte Respuesta de Corban para puntos de referencia.

    Clonación confiable usando una biblioteca

    Dado que la clonación de objetos no es trivial (tipos complejos, referencias circulares, función, etc.), la mayoría de las principales bibliotecas proporcionan funciones para clonar objetos. No reinvente la rueda: si ya está utilizando una biblioteca, compruebe si tiene una función de clonación de objetos. Por ejemplo,

      cloneDeep; se puede importar por separado a través del módulo lodash.clonedeep y es probablemente su mejor opción si no estás usando una biblioteca que proporcione una función de clonación profunda angular.copy jQuery.extend( true, { }, oldObject).clone() solo clona elementos DOM solo-clone; Parte de una biblioteca de módulos npm de dependencia cero que solo hacen una cosa. Utilidades libres de culpa para cada ocasión.

    ES6 (copia superficial)

    Object.assign() y sintaxis extendida. que copia los valores de todas las propiedades propias enumerables de un objeto a otro. Por ejemplo:

    var A1 = {a: "2"};
    var A2 = Objeto. asignar ({}, A1);
    var A3 = {...A1}; // Difundir sintaxis