¿El método de corte de Javascript devuelve una copia superficial?

3 minutos de lectura

avatar de usuario
SeongUk Mun

En un desarrollador de Mozilla traducido al idioma coreano dice que el ‘método de corte’ devuelve una nueva matriz copiada superficialmente.

así que probé mi código.

var animals = ['ant', 'bison', 'camel', 'duck', 'elephant'];

var t = animals.slice(2,4);
console.log

t[0] = 'aaa';
console.log
console.log(animals);

pero, si el método de corte devuelve una matriz poco profunda, la matriz de animales debe cambiarse con [‘ant’, ‘bison’, ‘aaa’, ‘duck’, ‘elephant’].

¿Por qué es una copia superficial?

  • ¿No acaba de citar la documentación que dice que es una copia superficial y no no cambiar el original? No entiendo tu pregunta.

    – Bergi

    10 de diciembre de 2017 a las 11:41


  • @Bergi Creo que la documentación se lee como una contradicción. Una copia superficial tiene la misma dirección de memoria que la anterior. Por lo tanto, cualquier cambio realizado en cualquiera de ellos cambia los atributos de ambos. Pero en el ejemplo anterior no sucede.

    – baermatias

    11 de marzo de 2021 a las 12:51

  • @sunwarri0r “Una copia superficial tiene la misma dirección de memoria que la anterior“- no, ¿no? ¿Dónde estás leyendo eso?

    – Bergi

    11 de marzo de 2021 a las 18:46

  • Creo que es el entendimiento del autor, por eso estaba haciendo esta pregunta. También mi comentario fue incorrecto, espero que este artículo también ayude a otros. en.m.wikipedia.org/wiki/Object_copying#Shallow_copy

    – baermatias

    11 de marzo de 2021 a las 19:12

slice no altera la matriz original. Devuelve una copia superficial de los elementos de la matriz original.

Los elementos de la matriz original se copian en la matriz devuelta de la siguiente manera:

Para las referencias de objetos (y no el objeto real), el corte copia las referencias de objetos en la nueva matriz. Tanto la matriz original como la nueva se refieren al mismo objeto. Si un objeto al que se hace referencia cambia, los cambios son visibles tanto para las matrices nuevas como para las originales.

Para cadenas, números y valores booleanos (no objetos String, Number y Boolean), slice copia los valores en la nueva matriz. Los cambios en la cadena, el número o el booleano en una matriz no afectan a la otra matriz. Si se agrega un nuevo elemento a cualquiera de los arreglos, el otro arreglo no se ve afectado.(fuente)

En su caso, la matriz consta de cadenas que en el segmento devolverían nuevas cadenas copiadas en la matriz, por lo que es una copia superficial. Para evitar esto, use la forma de objeto de matriz.

Puede ser que estés buscando esto. ¡Prueba esto!

let animals = ['ant', 'bison', 'camel', [1, 2]];

let t = animals.slice();

t[0] = 'aaa';    // string (primitive datatype)
t[t.length-1][0] = 0;    // array (object)

console.log
console.log(animals);

En caso de una copia superficial-

  • Los objetos reflejarán el cambio en el lugar original desde donde se copiaron superficialmente porque se almacenan como referencias (a su dirección en el Heap).
  • Los tipos de datos primitivos NO reflejan el cambio en el lugar original porque se almacenan directamente en la pila de llamadas (en contextos de ejecución).

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad