Javascript angular.copy的好处是什么?

Javascript angular.copy的好处是什么?,javascript,angularjs,Javascript,Angularjs,我在某些情况下使用angular.copy,例如将模型默认值复制到表单模型,如下所示: var customerModel = { name: '', point: 0 }; $scope.customer = angular.copy(customerModel); function save() { //... Reset $scope.customer after success submit $scope.customer = angular.copy(custome

我在某些情况下使用angular.copy,例如将模型默认值复制到表单模型,如下所示:

var customerModel = {
  name: '',
  point: 0
};

$scope.customer = angular.copy(customerModel);

function save() {
  //... Reset $scope.customer after success submit
  $scope.customer = angular.copy(customerModel);
}
。。。以防止更改默认customerModel

但为什么要复制空对象或数组?{}或[] 我在一些代码中发现在空对象或数组上使用angular.copy。为什么他们不直接将空对象分配给变量

$scope.customer = {}; // or [] for array
$http
  .get('example.com/api/v1/get/customer/1')
  .success(function(response) {
    $scope.customer = angular.copy(response.data);
    // or do you use $scope.customer = response.data ?
  })
;
如果在空对象或数组上使用copy,您能解释一下它的好处吗

ajax响应($http)呢? 还有一个问题,您对ajax响应做了什么?是否将其直接复制或分配给变量

$scope.customer = {}; // or [] for array
$http
  .get('example.com/api/v1/get/customer/1')
  .success(function(response) {
    $scope.customer = angular.copy(response.data);
    // or do you use $scope.customer = response.data ?
  })
;
如果您使用copy,您认为响应对象发生了什么?
它还在记忆中吗?还是自动删除?

复制对象以防止其他代码修改它。(原始对象可能会更改,但您的副本看不到更改)

如果要这样做:

 $scope.customer = customerModel
。。。一些回调/服务/什么都没有改变
customerModel
,您的范围将反映这种改变。这并不总是可取的,因此需要深度复制

复制空文字对象 这没什么区别。每次都是一个新的空对象。请注意,它与此非常不同:

this.customerModel = {};
$scope.customer = angular.copy(this.customerModel)
复制ajax响应数据
同样的规则也适用。如果您希望确保此对象不会从您下方更改(例如,如果您也将其传递到其他地方,则可能会发生这种情况),则应复制它。

angular.copy创建变量的深度副本,以便保存另一个变量的引用

有时,当用户不想使用callbyreference时,就会发生这种情况,然后根据您的问题进行深度复制

var customerModel = {
  name: '',
  point: 0
};
如果要使用
$scope.customer=angular.copy(customerModel)它将创建customerModel的深度副本

就$http服务而言,数据来自响应,若您将直接分配它,那个么引用调用将不会产生任何效果,因为数据来自另一个源。
因此,我宁愿在$http.get()的情况下直接分配它。

也许这可以帮助“它是否保留在内存中?还是自动删除?”因此,JavaScript使用GC,因此当不再使用该对象时,它将被释放。这可能是,也可能不是在您
angular.copy()
it之后。它是不确定的,您不应该依赖它在任何给定的时间触发,但是您应该注意确保您不会创建GC无法解开的引用。对于内存问题,当您复制
response.data
而不是
response
时,您不知道GC何时会释放
response
,因为它可能会在其他地方使用。@cespon不确定为什么需要此注释。作为tldr,它允许您访问深层对象复制,而无需另一个库。Angular在内部使用副本,这就是它存在的原因。您应该找到问题的根源,而不是盲目地对其进行优化。你确定你的文件缩小了吗?这是一个非常大的文件大小。我假设这包括角度和UI路由器也在缩小。如果您的问题是文件大小,GC将不会帮助您。为GC进行优化可能是您最后应该做的事情之一,因为它不太可能帮助您(因为GC是不确定的),复制对象当然不会阻止对原始对象的修改。它会阻止您的副本看到更改。复制空对象或数组如何?{}和[]。那么ajax响应呢,您更喜欢哪一种?复制或直接存储到变量?是的,这不会有什么不同。我编辑了这个问题以使其更清楚。希望你不介意再看一次。非常感谢。