Ao usar angular.copy, em vez de atualizar a referência, um novo objeto é criado e atribuído ao destino (se um destino for fornecido). Mas tem mais. Há uma coisa legal que acontece depois de uma cópia profunda.
Digamos que você tenha um serviço de fábrica com métodos que atualizam as variáveis de fábrica.
angular.module('test').factory('TestService', [function () {
var o = {
shallow: [0,1], // initial value(for demonstration)
deep: [0,2] // initial value(for demonstration)
};
o.shallowCopy = function () {
o.shallow = [1,2,3]
}
o.deepCopy = function () {
angular.copy([4,5,6], o.deep);
}
return o;
}]);
e um controlador que usa esse serviço,
angular.module('test').controller('Ctrl', ['TestService', function (TestService) {
var shallow = TestService.shallow;
var deep = TestService.deep;
console.log('****Printing initial values');
console.log(shallow);
console.log(deep);
TestService.shallowCopy();
TestService.deepCopy();
console.log('****Printing values after service method execution');
console.log(shallow);
console.log(deep);
console.log('****Printing service variables directly');
console.log(TestService.shallow);
console.log(TestService.deep);
}]);
Quando o programa acima for executado, a saída será a seguinte,
****Printing initial values
[0,1]
[0,2]
****Printing values after service method execution
[0,1]
[4,5,6]
****Printing service variables directly
[1,2,3]
[4,5,6]
Portanto, o interessante de usar a cópia angular é que, as referências do destino são refletidas com a alteração dos valores, sem a necessidade de reatribuir os valores manualmente, novamente.