【问题标题】:What is the difference between angular.copy() and an assignment (=)?angular.copy() 和赋值 (=) 有什么区别?
【发布时间】:2015-06-27 06:28:36
【问题描述】:

当按钮点击事件通过事件参数发生时,我想分配一些值:

$scope.update = function(context) {
    $scope.master = context;
};

我已将 user 值分配给 $scope.master

现在我看到angular.copy()。所以我用angular.copy写了代码。

$scope.update = function(context) {
    $scope.master = angular.copy(context)
};

两者都在做同样的事情,那么有什么区别?请告诉我angular.copy()equal(=) 之间的区别。

【问题讨论】:

  • 如果我没记错的话,angular.copy() 执行深拷贝,而= 只是将变量分配给相同的内存地址,所以angular.copy() 的结果将始终是一个新对象您可以在不修改原始对象的情况下安全地进行修改。

标签: javascript angularjs


【解决方案1】:

read here angular.copy() 可以执行参数的深层复制(参见“克隆”) - 本质上是创建一个新对象 - 而使用赋值运算符 = 只是分配 reference 的。

因此,在后一种情况下,如果您要更改 $scope.master 中的某些内容,您也将更改 context

干杯,

【讨论】:

  • “=”与 angular.extend() 有何不同。你能解释一下吗
【解决方案2】:

= 表示引用,而angular.copy() 创建一个新对象作为深层副本。

使用= 意味着更改context 的属性将更改$scope.master 的相应属性,反之亦然。

使用angular.copy(),这两个对象将保持独立,更改不会相互影响。

【讨论】:

    【解决方案3】:

    当您在 Javascript 中操作原始类型(如 int)时,=angular.copy 与复制变量值的任何赋值结果相同。

    当您在 Javascript 中操作对象时,= 将现有对象的引用分配给变量,angular.copy 正在复制,这意味着创建一个具有相同属性和值的新对象,并将新对象的引用分配给变量。

    【讨论】:

      【解决方案4】:

      简单

      angular.copy() 与 jquery 的 .clone() 相同,后者创建并返回与部门相同的对象副本。 (按值调用)

      = 它确实用它的引用值分配值(通过引用调用),

      a = b 在此 a 中将 b 值分配给 a,但如果 ab 都是数组,则 a 的变化将反映在 b 中,反之亦然。

      【讨论】:

      • Call-by-value 和 call-by-reference 是与方法调用相关的不同概念。这是关于分配和对象创建的。你不应该混淆这两件事。
      • @AndersR.Bystrup 我能知道为什么它会被认为和 oops 一样吗?
      【解决方案5】:

      在赋值中我们共享对象的引用。当我们使用 angular.copy 时,我们会创建一个具有相同对象详细信息的新参考点。

      var user1={name:'hello'};
      

      对象{name:'hello'}有一个参考点(比如说123,保存在user1中; 当我们写

      var user2=var user1; //reference point of user2 is also 123 
      user2.name="world"; //we update the object in 123
      console.log(user1.name); //answer is "world" because reference object is updated
      

      如果您在更改 user2 中的某些内容时不想更新 user1,我们必须创建一个副本。 我们可以这样做

      var user2=angular.copy(user1);
      

      var user2=Object.assign({},user1);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-04
        • 1970-01-01
        • 2011-03-04
        • 2018-04-20
        • 2010-10-01
        • 1970-01-01
        相关资源
        最近更新 更多