angular.copy()和赋值(=)之间有什么区别?

37

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

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

我已经给 $scope.master 赋值了 user 的值。

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

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

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


12
如果我没理解错的话,angular.copy() 执行的是深拷贝,而 = 只是将变量赋值到同一内存地址,因此 angular.copy() 的结果始终将是一个新对象,您可以安全地修改它而不会修改原始对象。 - RevanProdigalKnight
5个回答

49

此处所述,angular.copy()执行参数的深拷贝(即“克隆”)-从本质上创建一个新对象-而使用赋值运算符=只是分配引用

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

谢谢。


3
"=" 和 angular.extend() 有什么区别?你能解释一下吗? - user1776573

11

=代表引用,而angular.copy()创建一个新的对象作为深度复制。

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

使用angular.copy(),这两个对象将保持分离,更改不会反映在彼此之间。


3

当你在JavaScript中操作原始类型(如int)时,=angular.copy与任何赋值一样,结果是复制变量的值。

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


2

简单来说

angular.copy()与jquery的.clone()相同,它创建并返回具有深度的相同对象副本。(按值调用)

=它将赋值与其引用值(call by reference)一起使用,

a = b在这里,a将被分配为b的值,但如果ab都是数组,则对a的更改将反映在b中,反之亦然。


按值调用和按引用调用是与方法调用相关的不同概念。这涉及到赋值和对象创建。你不应该混淆这两个东西。 - Anders R. Bystrup
@AndersR.Bystrup,能否告诉我为什么它会被认为与面向对象编程相似? - Pankaj Parkar

0
在赋值中,我们共享对象的引用。当我们使用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

如果您在更改用户2的内容时不想更新用户1,则必须创建副本。 我们可以这样做

var user2=angular.copy(user1);

或者

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接