En general, es buena práctica no modificar los datos directamente. Bajo mi punto de vista, el más importante es justamente cuando modificamos datos previamente a guardarse en un servicio. Dado el siguiente ciclo de vida de datos:
Hacemos una petición GET al servidor para recuperar los datos.
La aplicación modifica los datos en local previamente a la acción de guardar.
Hacemos una petición POST o PUT al servidor en la cual enviamos los datos modificados.
Hasta aquí todo parece bien, pero estos simples pasos pueden tener un problema. Si el punto 3 falla, los datos que hayamos modificado en el punto 2 no estarán sincronizados con los datos del servidor.
Veamos un ejemplo sencillo:
Aunque este ejemplo es bastante tonto, si la modificación falla, tendremos una propiedad local modificada. Si además, esta propiedad está visible/bindada en la vista, es probable que se llegue a mostrar en algún momento. Pues bien, ese dato es erróneo. La solución es clonar el objeto antes de modificarlo:
Esta solución sirve únicamente si se trata de objetos planos. En UI5 es muy habitual trabajar con objetos que tienen profundidad, ya que con OData podemos hacer expand. Pues la destructuración en estos casos no funcionará como esperamos.
clone, deepClone
Por este motivo, para clonar objetos y arrays es mejor utilizar clone y deepClone. Con clone podemos hacer lo mismo que acabamos de ver y con deepClone una copia con la profundidad (tiene un segundo parámetro para indicar la profundidad máxima, que por defecto es 10):
extend, deepExtend, merge
También tenemos los métodos extend, deepExtend y merge. Igual que en el caso anterior, extend extenderá el primer nivel del objeto en uno nuevo, mientras que deepExtend y merge lo hará a todos los niveles. Esto puede ser muy útil para crear objetos nuevos basados en otros, a la vez que estableces valores por defecto para propiedades (en el caso de que no existan) o bien machacas las existentes en el objeto por unas nuevas:
jQuery.sap.extend
No debe utilizarse jQuery.sap.extend porque está obsoleto
Anteriormente en UI5 teníamos la función jQuery.sap.extend. Esto ya está deprecated y debe ser sustituido por algo nativo de la plataforma o los métodos mencionados en este artículo.