angular js - 复制对象而不复制其引用

时间:2017-01-06 10:46:12

标签: javascript angularjs

我需要在javascript中复制一个数组,这样两个数组的地址应该不同。怎么办呢......

我试过了

$scope.users = data.users;
 $scope.usersTemp = [];
$scope.usersTemp.push($scope.users );

and
 $scope.usersTemp = $scope.usersTemp

5 个答案:

答案 0 :(得分:1)

你试过angular.copy吗?类似的东西:

$scope.usersTemp = angular.copy($scope.usersTemp)
  

https://docs.angularjs.org/api/ng/function/angular.copy

答案 1 :(得分:0)

您可以使用:

angular.copy ( myObjorArrayetc )

答案 2 :(得分:0)

您要做的似乎是创建JS数组的浅拷贝。 如果这不是您的使用案例,请告诉我。

在JS

中有几种方法可以做到这一点
const copy = [...original]; // es6 only, uses Symbol.iterator
const copy = original.slice(); // slices the array from index 0,      
                               // returning a shallow copy

const copy = Array.from(original, val => val); // es6 only, takes an 
// array-like object with .length property and a map function
const copy = original.map(x => x); 
// call to Array.prototype.map with identity function.

你可以拥有:

const a = [1, 2];
const b = // shallow copy with one of the methods
a.push(3); // and b is still [1, 2]

关于其他答案的快速说明:快速查看角度文档here似乎表明angular.copy返回深层副本

掌握差异非常重要:浅拷贝只会创建一个新对象并将所有值放在其中,而深拷贝将尝试复制每个值。这意味着,由于JS中的对象是可变的,如果您创建浅拷贝,您仍然可以与其他副本共享其所有值。深层复制不是这种情况。

例如:

const a1 = [{a: {b: 3}}];
const a2 = // shallow copy
(a1 === 2) // false
a1[0].a.b = 4 // reassign a prop of a value contained inside a1
(a1[0].a.b === 4) // true 

如果制作了深层副本,则会生成一个新对象。

结论:根据您的使用情况使用您需要的内容。可以快速制作浅拷贝,但是受到不需要的突变,深拷贝的创建成本要高得多,但对共享访问引起的突变免疫。作为旁注,当然对这两种方法的GC有影响(意味着浅拷贝不会释放对原始中包含的值的引用)。

答案 3 :(得分:0)

您可以使用

var copy = angular.copy(object);

它将完全复制该对象。

答案 4 :(得分:0)

在数组的情况下使用赋值操作时,复制和原始对象都会绑定更改。因此,请使用angular.copy(oldArray, newArray)